自动装箱和自动拆箱理解

  • 装箱:
    • 自动将基本数据类型转换为包装器类型;
    • 调用方法: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。
  • 参考:
 
 
 
 

转载于:https://www.cnblogs.com/buwuliao/p/10681133.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值