java中的自动装箱与拆箱

       在需要的情况下,基本数据类型与包装类型可以通用。有些时候我们必须使用引用数据类型时,可以传入基本数据类型。比如:基本数据类型可以使用运算符直接进行计算,但是引用类型不可以。而基本类型包装类作为引用类型的一种却可以计算,原因在于,Java”偷偷地”自动地进行了对象向基本数据类型的转换。相对应的,引用数据类型变量的值必须是new出来的内存空间地址值,而我们可以将一个基本类型的值赋值给一个基本类型包装类的引用。原因同样在于Java又”偷偷地”自动地进行了基本数据类型向对象的转换。

以下以Integer类为例:

自动装箱:基本数值转成对象

Integer i = 4;      //相当于Integer i = Integer.valueOf(4);

自动拆箱:对象转成基本数值

i = i + 5;       //等号右边相当于将i对象转成基本数值(自动拆箱) i.intValue() + 5; 加法运算完成后再次装箱,把基本数值转成对象。

注意自动装箱细节问题:

        Integer i = new Integer(1);
        Integer j = new Integer(1);
        System.out.println(i==j);// false 对象地址
        System.out.println(i.equals(j));// true  继承Object重写equals,比较的对象数据
        System.out.println("===================");
        Integer a = 500;
        Integer b = 500;
        System.out.println(a==b);//false
        System.out.println(a.equals(b));//true
        System.out.println("===================");
        //在jdk1.5自动装箱时,如果数值在byte范围之内,JVM不会新创建对象空间而是使用原来已有的空间。
        Integer aa = 127; // Integer aa = new Integer(127)
        Integer bb = 127; // Integer bb = aa;
        System.out.println(aa==bb); //true
        System.out.println(aa.equals(bb));//true

Integer.valueOf(i)方法与Integer i=new Integer(i)的不同: 

Integer i=new Integer(12); 是指明了在堆内存中创建对象。

Integer j=12; 是自动装箱,调用valueOf 方法,valueOf(i)方法被调用时会判断 i 的值是否为范围在[-128,127] 的整数,如果是则直接从Integer缓存中获取,如果不是则使用new Integer(i)并将对象返回。

加强练习:

            Integer i= new Integer(12);
            Integer j=12;
            Integer k=Integer.valueOf(12);
            Integer l= new Integer(232);
            Integer m=232;
            Integer n=232;

            Double  q = 232.0;

            System.out.println("use ==.......");    
            System.out.println(i==12);     //true
            System.out.println(i==j);        //false
            System.out.println(j==k);    //true

            System.out.println(l==232);  //true
            System.out.println(l==m);   //false
            System.out.println(m==n);   //false

            System.out.println("use equals.....");
            System.out.println(m.equals(n));  //true
            System.out.println(m.equals(q));  //false

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值