对象包装器和自动装箱

一道很经典的面试题

阅读下面程序输出结果:

package Main;
 
public class Main {
 
   public static void main(String[] args) {
 
     Integer i1 = new Integer(97);   
     Integer i2 = new Integer(97); 
     System.out.println(i1 == i2);
     System.out.println(i1.equals(i2));
     System.out.println("----------------");
 
     Integer i3 = new Integer(197);  
     Integer i4 = new Integer(197);
     System.out.println(i3 == i4);
     System.out.println(i3.equals(i4));
     System.out.println("----------------");
 
     Integer i5 = 97;   
     Integer i6 = 97; 
     System.out.println(i5 == i6);
     System.out.println(i5.equals(i6));
     System.out.println("----------------");
 
     Integer i7 = 197;  
     Integer i8 = 197;
     System.out.println(i7 == i8);
     System.out.println(i7.equals(i8));
 
   }
}

输出:

false

true

----------------

false

true

----------------

true

true

----------------

false

true

 

分析:

      在String类前面文章,我们画过内存图。已经了解到== 这个符号既可以比较基本数据类型和引用数据类型,如果是基本数据类型,比较的是值相同,如果是引用数据类型,比较的是对象的内存地址是否相同。利用equals方法比较的是值是否相同,因为Integer类里面重写了Object类的equals方法。

 

      所以,上面的equals方法打印输出都是true,这个很简单,没有疑问。然后来看,前面两组里面的==判断,由于==是比较内存地址,我们看到s1 s2 s3 s4都使用了new关键字,所以这两组里面的==比较也是不相等,内存地址不同。

 

      最后来看后两组,同样是自动包装,为什么97就输出true,而197就不相等。我们这里先抛出个结论:在Java中,byte的取值范围是-128到127之间。在自动包装和拆箱中,如果变量取值范围在byte的范围内,在自动包装和拆装过程中就不新创建对象(堆内存);如果范围不在byte取值范围内,就会新创建Integer对象。

总结

  1. ==对于基本类型判断的是值,对于引用类型判断的是内存地址。
  2. equals方法对于引用类型判断的都是值
  3. Integer tp=new Integer(97) 和 Integer tp=97是不一样的。
    前者是又创建了一个对象。后者是发生了自动装箱,自动装箱变量取值范围在byte范围以内的,只要装箱的值一样,对象的地址都一样。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值