包装类

包装类

为什么要用包装类?

1.某些方法的参数必须是对象,为了让基本数据类型的数据能作为参数,提供了包装类

2.包装类提供了很多功能,如:获取基本类型范围的最大值,字节数的方法

3.可以实现字符串和基本数据类型间的转换

代码示例:

public  class Demo01 {
    public static void main(String[] args) {
        String a="10";
        int i = Integer.parseInt(a);//将字符串转换为基本数据类型中的int类型
        Integer integer = Integer.valueOf(a);//将字符串转换为Integer包装类
        double  v= Double.parseDouble(a);//将字符串转换为基本数据类型中的double类型
        Double aDouble = Double.valueOf(a);//将字符串转换为Double包装类
        System.out.println("i="+i);
        System.out.println("Integer="+integer);
        System.out.println("v="+v);
        System.out.println("Double="+aDouble);
    }
}
运行结果:
i=10
Integer=10
v=10.0
Double=10.0

自动装箱、拆箱

public class Demo02 {
    public static void main(String[] args) {
        int i = 10;
        Integer ii = new Integer(i);//手动将基本数据类型转换为包装类
        int c = ii.intValue();//手动将包装类转换为基本数据类型

        //jdk1.5以后:自动装箱(基本数据类型-->包装类)
        Integer a=i;//底层使用Integer.valueOf()完成自动装箱,Integer.valueOf()其实也是通过new Integer()实现的

        //jdk1.5以后:自动拆箱(包装类-->基本数据类型)
        int b=a;//底层使用intValue()完成自动拆箱
    }

}

注意

1.jdk1.5之后,增加了自动装箱,自动拆箱功能

2.自动装箱时调用的valueOf()方法,valueOf()底层其实调的还是new Integer()方法

3.自动拆箱调的xxxVaule()方法

4.包装类在自动装箱时为了提高效率,对于-128~127之间的值进行了缓存处理。超过范围后,对象之间不能在使用==进行数值的比较,而是使用equals方法

valueOf源码:
public static Integer valueOf(int i) {
        if (i >= IntegerCache.low && i <= IntegerCache.high)
            return IntegerCache.cache[i + (-IntegerCache.low)];
        return new Integer(i);//超出-128~127范围的会创建对象
    }

代码示例

public class Demo03 {
    public static void main(String[] args) {
        int a=10;
        Integer b=10;
        //==比较的地址,equals比较的值
        System.out.println(a==b);// true            + - * / == 类型不一样时,会自动拆箱
        System.out.println(b.equals(a));//true
        Integer aa=new Integer(10);
        Integer bb=new Integer(10);
        System.out.println(aa==bb);//false,地址不同
        System.out.println(aa.equals(bb));//true
        Integer aaa=125;
        Integer bbb=125;
        System.out.println(aaa==bbb);//true,缓存中取
        System.out.println(aaa.equals(bbb));//true
        Integer aaaa=130;
        Integer bbbb=130;
        System.out.println(aaaa==bbbb);//false,地址不同
        System.out.println(aaaa.equals(bbbb));//true
    }
}
上一篇:MyEclipse 设置注释


下一篇:IntegerCache的妙用和陷阱!