黑马程序员_Java基础_泛型应用 和 基本数据类型对象包装类

------- android培训java培训、期待与您交流! ----------


泛型:JDK1.5版本之后出现的新特性   用于解决安全问题,是一个类型安全机制

好处:
1.将运行时期出现问题ClassCastException,转移到了编译时期
 方便于程序员解决问题,让运行好事情问题减少,安全

 
2.避免了强制转换麻烦

泛型格式: 通过<>来定义要操作的引用数据类型

 

在使用java 提供的对象时,什么时候写泛型呢?

通常在集合框架中很常见
只要见到<>就要定义泛型

其实<>就是用来接收类型的

当使用集合时,将集合中要存储的数据类型作为参数传递到<>中即可

什么时候定义泛型类?
当类中要操作的引用数据类型不确定的时候
早起定义Object来完成扩展
现在定义泛型来完成扩展

例子1:

<strong>public class GenericDemo {


    public static void main(String[] args) {

        ArrayList<String> list = new ArrayList<String>();

        

        list.add("a");

        list.add("alg");

        list.add("ngdt");

        list.add("qwwfe");

//      list.add(4);   这会在编译时报错,因为数据类型不一致  

//      其实,List存储的是对象类型,而基本类型先经过自动装箱拆箱放入List集合中

        

        Iterator<String> it = list.iterator();

        while(it.hasNext()){

            String s = it.next();

            System.out.println(s+":"+s.length());
        } 

    }


}</strong>


 例子2:

<strong>public class GenericDemo01 {

    public static void main(String[] args) {

        TreeSet<String> tree = new TreeSet<String>(new MyComparator());

        

        tree.add("a");

        tree.add("alg");

        tree.add("akk");

        tree.add("qwwfe");

        tree.add("ngdt");

        

        Iterator<String> it = tree.iterator();

        while(it.hasNext()){

            String s = it.next();

            System.out.println(s);

        }

    }

}

class MyComparator implements Comparator<String>{


    @Override

    public int compare(String o1, String o2) {

        int num = new Integer(o1.length()).compareTo(new Integer(o2.length()));

        if(num == 0 ){

            return o1.compareTo(o2);

        }

        return num;

    }

    

}</strong>

泛型类定义的泛型,在整个类中有效,如果被方法使用
那么泛型类的对象明确要操作的具体类型后,所有要操作的类型就已经固定了

为了让不同方法可以操作不同类型,而且类型还不确定
那么可以将泛型定义在方法


特殊之处:
静态方法不可以访问类上的定义的泛型
如果静态方法操作的应用数据类型不确定,可以将泛型定义在方法上
 

 例子3:
<strong>//在类名中定义泛型

class Demo<T>{

    public void show(T t){

        System.out.println("show :" + t);

    }

    public void print(T t){

        System.out.println("print :" + t);

    }

    public static <W> void method(W w){

        System.out.println("method:" + w);

    }

}


//在方法中定义泛型   (根据自己的需要进行选择定义)

class Demo01{

    public <T> void show(T t){

        System.out.println("show :" + t);

    }

    public <T> void print(T t){

        System.out.println("print :" + t);

    }

}


public class GenericDemo03 {


    public static void main(String[] args) {

        

        //将泛型定义在类中,整体都是泛型

        Demo<String> d = new Demo<String>();

        d.show("hello");

        d.print("work");

        d.method("静态方法");

        

        //方法中能定义多种类型

        Demo01 e = new Demo01();

        e.show("i am String");

        e.print(new Integer(3));

    }

}</strong>
 例子4:
<strong>/*

 泛型定义在接口上

 */

interface Inter<T>{

    void show(T t);

} 


class InterImp01 implements Inter<String>{

    @Override

    public void show(String t) {

        System.out.println(t);

    }

    

}


class InterImp<T> implements Inter<T>{

    @Override

    public void show(T t) {

        System.out.println(t);

    }

}


public class GenericDemo04 {

    public static void main(String[] args) {

        InterImp01 i = new InterImp01();

        i.show("interImp");

        

        InterImp<Integer> n = new InterImp<Integer>();

        n.show(4);

    }


}</strong>

  ?通配符,  也可以理解为占位符   表示任意
 
 泛型的限定:
 ? extends E :可以接收 E类型或者E的子类型。   上限
 ? super E :可以接收E类型或者E的父类型。   下限

例子5: 
<strong>public class GenericDemo05 {


    public static void main(String[] args) {

        

/*      ArrayList<String> list = new ArrayList<String>();

        list.add("abc1");

        list.add("abc2");

        list.add("abc3");

        list.add("abc4");

        

        ArrayList<Integer> list01 = new ArrayList<Integer>();

        list01.add(1);

        list01.add(2);

        list01.add(3);

        list01.add(4);

        printColl(list);

        printColl(list01);

*/

        ArrayList<Person> list02 = new ArrayList<Person>();

        list02.add(new Person("lisi__01"));

        list02.add(new Person("lisi__02"));

        list02.add(new Person("lisi__03"));

        list02.add(new Person("lisi__04"));

        showColl(list02);

        

        ArrayList<Student> list03 = new ArrayList<Student>();

        list03.add(new Student("student__01"));

        list03.add(new Student("student__02"));

        list03.add(new Student("student__03"));

        list03.add(new Student("student__04"));

        showDownColl(list03);

    }

    

    //上限方式

    public static void showColl(ArrayList<? extends Person> list){

        Iterator<? extends Person> it = list.iterator();

        while(it.hasNext()){

            System.out.println(it.next().getName());

        }

    }

    //下限方式

    public  static void showDownColl(ArrayList<? super Student> list){

        Iterator<? super Student> it = list.iterator();

        while(it.hasNext()){

            System.out.println(it.next().toString());

        }

    }

    

    

    //迭代器的遍历

    public static void printColl(ArrayList<?> list){

        Iterator<?> it = list.iterator();

        while(it.hasNext()){

            System.out.println(it.next());

        }

    }


}


class Person{

    private String name;

    Person(String name){

        this.name = name;

    }

    public String getName() {

        return name;

    }


    public void setName(String name) {

        this.name = name;

    }

}

class Student extends Person{

    Student(String name){

        super(name);

    }

}</strong>
 例子6:
<strong>/*

 * TreeSet泛型父类继承比较   

 * 

 */

public class GenericDemo06 {


    public static void main(String[] args) {

        TreeSet<Student> tree = new TreeSet<Student>(new Compa());

        tree.add(new Student("student__02"));

        tree.add(new Student("student__02"));

        tree.add(new Student("student__01"));

        tree.add(new Student("student__04"));

        tree.add(new Student("student__03"));

        

        Iterator<Student> it = tree.iterator();

        while(it.hasNext()){

            System.out.println(it.next().getName());

        }

        

        TreeSet<Work> work  = new TreeSet<Work>(new Compa());

        work.add(new Work("work__03"));

        work.add(new Work("work__01"));

        work.add(new Work("work__04"));

        work.add(new Work("work__02"));

        Iterator<Work> i = work.iterator();

        while(i.hasNext()){

            System.out.println(i.next().getName());

        }

        


    }


}


class Compa implements Comparator<Person>{

    @Override

    public int compare(Person o1, Person o2) {

        return o1.getName().compareTo(o2.getName());

    }

    

}


class Work extends Person{

    Work(String name) {

        super(name);

    }

    

}</strong>


例子7:
class Worker {


}


class Utils<E> {

    private E e;

    public E getObject() {

        return e;

    }


    public void setObject(E e) {

        this.e = e;

    }

}


public class GenericDemo02 {

    public static void main(String[] args) {

        Utils<Worker> u = new Utils<Worker>();

        u.setObject(new Worker());

        Worker w = u.getObject();

    }


}

 1.基本数据类型对象包类

byte    Byte
short    Short
int        Integer
long    Long
boolean    Boolean
float    Float
double    Double
char    Charcter

2.基本数据类型转换成字符串
基本数据类型呢+""
基本数据类型呢.toString(基本数据类型值)。
如:Interger.toString(34);//将34转换成为"34"
3.字符串转换成基本数据类型
int a = Integer.parseInt("123");
double b = Double.parseDouble("12.34");
boolean b = Boolean.parseBoolean("true");
Interger i = new Integer("123");
int num = i.intValue();
4.十进制转成其他进制
toBinaryString();二进制
toHexString();十六进制
toOctalString();八进制
5.其他进制转换成十进制
parseInt(String str,int radix);//radix表示进制数


 测试例子1:

public class IntegerDemo {
    /**
     * @param args
     */
    public static void main(String[] args) {
        //整数类型的最大值
        print("int max:"+ Integer.MAX_VALUE);
        //整数类型的最小值
        print("int min:" + Integer.MIN_VALUE);
        //将一个字符串转成整数
        int num = Integer.parseInt("123");  //必须输入数字格式,否则或抛出异常
        print("num+4:" +( num +4));
        long num_ = Long.parseLong("123456789");  //必须输入数字格式,否则或抛出异常
        print("num_+4:" +( num_ +4));
        
        //十进制转化二进制
        print(Integer.toBinaryString(5));
        //十进制转换十六进制
        print(Integer.toHexString(60));
        //十进制转换八进制
        print(Integer.toOctalString(8));
        
        
        //二进制转十进制
        print(Integer.parseInt("110", 2));
        //八进制转十进制
        print(Integer.parseInt("10", 8));
        //十六进制转十进制
        print(Integer.parseInt("3c", 16));
        
        
        
    }
    
    public static void print(Object obj){
        System.out.println(obj.toString());
    }
}


 简单测试例子:
/*
 JDK1.5
 */
 
public class IntegerDemo01 {
    public static void main(String[] args) {
//      Integer x = new Integer("4");
        Integer x = 4; //自动装箱   相当于new Integer("4");
        x = x + 2;  //x+2    x进行自动拆箱,变成int类型数据与2进行运算,得到结果再进行装箱
        
        Integer m = 128;
        Integer n = 128;
        System.out.println(m==n);    //结果:false
        
        Integer a = 127;
        Integer b = 127;
        System.out.println(a==b);   //结果是:true
        //因为a和b指向同一个Integer对象
        //因为当数值在byte(-128~127)范围内容,对于新特性,如果该数值已经存在,则不会再开辟新的内存空间
        
        Integer y = new Integer("123");
        Integer z = new Integer(123);
        
        System.out.println("y==z"+(y==z));   //false   因为y   z分别是两个对象
        System.out.println("y.equals(y)"+x.equals(y));  //true   两个数值是一样大小的
        
    }
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值