开发者社区> 山月风成> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

浅析自动装箱、自动拆箱

简介: 浅析自动装箱、自动拆箱 我们知道,在java中有基本类型和类类型,基本类型有:char、byte、short、int、double、float、long、boolean这8种,在需要将基本类型打包成对象来进行操作的时候,这时,就用到了打包这一操作,该操作的自动行为就叫做自动装箱、自动拆箱。
+关注继续查看

浅析自动装箱、自动拆箱

  1. 我们知道,在java中有基本类型和类类型,基本类型有:char、byte、short、int、double、float、long、boolean这8种,在需要将基本类型打包成对象来进行操作的时候,这时,就用到了打包这一操作,该操作的自动行为就叫做自动装箱、自动拆箱。

package demo;

public class IntegerDemo {

    public static void main(String[] args) {

        int data1=10;
        int data2=20;//基本数据类型

        Integer warpper1 = new Integer(data1); //将基本类型打包成对象类型
        Integer warpper2 = new Integer(data2);  

        System.out.println(data1/3);
        System.out.println(warpper1.doubleValue()/3); //Integer对象进行转换成double类型
        System.out.println(warpper1.compareTo(warpper2));//比较warpper1和warpper2的大小,-1后者大
    }
}
  • 这些打包类的目的就是提供对象实例作为“壳”,将基本类型打包在对象之中,这样就可以操作对象了,将基本类型当作对象使用。

  1. 自动装箱、自动拆箱
    在J2SE5.0之后提供了自动装箱、自动拆箱的功能。
    上面的代码可以写成这样:

package demo;

public class AutoIntegerDemo {

    public static void main(String[] args) {

        Integer warpper1 = 10;
        Integer warpper2 = 20;
        System.out.println(warpper1 / 3);   
        //自动拆箱,对象转成了基本类型进行运算                                 System.out.println(warpper1.compareTo(warpper2));
    }
}
结果:
3
-1

  • warpper1、warppper2运行时会参考Integer实例,自动装箱和自动拆箱的功能实现,实际上是编译程序蜜糖,让你在编写程序的时候尝点甜头,程序视情况决定是否进行拆箱、装箱。
  • 以上例来说,在warpper1在参考Integer实例时。实际使用的是Integer.valueOf()方法。
package demo;

public class AutoIntegerDemo {

    public static void main(String[] args) {

        Integer w1 = 100;
        Integer w2 = 100;

        if (w1 == w2) {
            System.out.println("第一次比较 w1 =w2");
        } else {
            System.out.println("第一次比较 w1 != w2");
        }

        w1 = 200;
        w2 = 200;
        if (w1 == w2) {
            System.out.println("第二次比较 w1 =w2");
        } else {
            System.out.println("第二次比较 w1 != w2");
        }
    }
}
结果:
第一次比较 w1 =w2
第二次比较 w1 != w2
  • 看看为什么都是100的时候相等,200的时候不等,这里就要说到Integer.valueOf()方法了
 public static Integer valueOf(int i) {

        if (i >= IntegerCache.low && i <= IntegerCache.high)

         return IntegerCache.cache[i + (-IntegerCache.low)];
        return new Integer(i);
    }
  • 如果传入的int i 在IntegerCache.low与IntegerCache.high之间,看看前面缓存中没有打包相同的值,如果有,直接返回;否则创建一个新的实例。
  • 但是IntegerCache.low的默认值-128,IntegerCache.high的默认值是127,所以我们回去看看代码,当w1、w2=100的时候,因为有了w1的缓存,w2在参考Integer实例的时候,直接引用缓存,所以w1=w2相同。
  • w1、w2=200时,在valueOf的判定条件为false,两个参数参考的两个不同的Integer实例,所以==比较的时候是false。
  • 最后一点,在比较两个对象是否相等,别用== 或者!=进行比较,请使用equals()方法。谢谢

    业精于勤,荒于嬉;行成于思,毁于随

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
Java装箱与自动拆箱
Java 编译器在`基本数据类型`和其对应的`对象封装类型`之间进行自动转换.例如将`int`转成`Integer`,将`char`转成包装类`Character`等等.其他基本数据类型的转换如下:
257 0
浅析APP控件:模态弹窗与非模态弹窗
浅析APP控件:模态弹窗与非模态弹窗 在手机app应用中各种格式的弹窗效果相信大家都看过,此次分享就来谈谈关于app弹窗设计以及弹窗的适用情景。 一、弹窗的定义 1、弹窗作用 弹窗是为了让用户回应,需要用户与之交互的窗口。
3472 0
使用JSDoc自动生成代码文档
译者按: 代码要有规范的注释,遵从jsDoc规则来注释可以生成有用的文档。 原文: Generate docs and host it with JSDoc and GitHub Pages 译者: Fundebug 为了保证可读性,本文采用意译而非直译,并且对源代码进行了大量修改。
1186 0
make自动生成依赖文件的两种形式
最近编译源文件发现当修改头文件后,make并不会自动把包含此头文件的所有源文件重新编译,而每次都是需要把对应的中间文件清除才能重新编译,非常的麻烦。因此需要make自动对源文件所依赖的头文件进行管理,即make自动生成依赖文件。
1134 0
+关注
山月风成
君子不以辞尽人,故天下有道,则行有枝叶;天下无道,则辞有枝叶。热爱技术岗位,因为这里单纯友好,自由和分享。
37
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载