自动装箱和自动拆箱理解

  • 装箱:
    • 自动将基本数据类型转换为包装器类型;
    • 调用方法:Integer 的 valueOf (int) 方法
  • 拆箱:
    • 自动将包装器类型转换为基本数据类型。
    • 调用方法:Integer 的 intValue 方法
  • ==什么时候会自动拆箱?
    • 包装类 “==” 运算在不遇到算术运算的情况下不会自动拆箱。即只有遇到运算符才会自动拆箱。
  • 《深入理解JVM虚拟机》书中的一个测试例子及解答解析:
    • ![](https://ws1.sinaimg.cn/large/b35c33e9ly1g1wrrcutypj20hg0k80ta.jpg)

    • 解释说明:
      • 初始化部分:所有的Integer对象全是:Integer a=Integer.valueOf(1);
      • 第一行:true。不会自动拆箱,实际比较:Integer.valueOf(3)==Integer.valueOf(3)。
        • 但是Integer.valueOf方法,当-128<数值<128时,实际返回的时缓存数组里的一个对象,所以这两个其实是同一个对象,所以返回true。
      • 第二行:false。不会自动拆箱。和第一行的不同在于数值>128,每次都返回新对象。
      • 第三行:true。会自动拆箱。实际是 int 的比较。
      • 第四行:true。会先触发自动拆箱过程,再触发自动装箱过程。
        • 也就是说 a+b,会先各自调用 intValue 方法(拆箱),得到了加法运算后的数值之后,便调用 Integer.valueOf 方法(装箱),再进行 equals 比较。
        • 为什么会先拆箱?个人感觉,+运算符只对基本类型生效。所以需拆箱;
          注:如有错误请指正。
        • 为什么又装箱?因为equals方法的参数是Object类型。
          注:如有错误请指正。
      • 第五行:true。会自动拆箱。
      • 第六行:false。过程见第四行。但是为什么结果是false?因为equals方法会先看入参的类型,只有和当前对象类型一致,才比较数值;否则,返回false。
  • 参考:

猜你喜欢

转载自www.cnblogs.com/buwuliao/p/10681133.html