爱程序网

Integer封装与拆箱

来源: 阅读:

Integer封装与拆箱

简介:

目录:

  1. Integer自动封装的陷阱
  2. Integer自动拆箱机制

Integer自动封装的陷阱

public class IntegerDemo {

public static void main(String[] args) {
    
    Integer a=1000,b=1000; 
    Integer c=100,d=100; 
    
    System.out.println(a==b);//false
    System.out.println(c==d);//true
  }

}

我们知道==运用于对象时,比较的是双方是否拥有同一个对象,而非简单的比较双方是否拥有相同的值,这里的abcd都是新建出来的对象,按理说都应该输入false才对。

 

但是道理其实很简单,我们去看下Integer这个类的源码就明白了其中的奥秘:

public static Integer valueOf(int i) {
    assert IntegerCache.high >= 127;
    //IntegerCache.low = -128, IntegerCache.high = 127
    if (i >= IntegerCache.low && i <= IntegerCache.high)
        return IntegerCache.cache[i + (-IntegerCache.low)];
    return new Integer(i);
}

 

当我们声明一个Integer c = 100;的时候。此时会进行自动装箱操作,简单点说,也就是把基本数据类型转换成Integer对象,而转换成Integer对象正是调用的valueOf方法,可以看到,Integer中把-128至127 缓存了下来。官方解释是小的数字使用的频率比较高,所以为了优化性能,把这之间的数缓存了下来。这就是为什么这道题的答案回事falseture了。当声明的Integer对象的值在-128-127之间的时候,引用的是同一个对象,所以结果是true

 

Integer自动拆箱机制

public class IntegerDemo {

public static void main(String[] args) {
    
    Integer a = new Integer(1000);
    int b = 1000;
    Integer c = new Integer(10);
    Integer d = new Integer(10);

    System.out.println(a == b);//true
    System.out.println(c == d);//false
    
  }
}

 看到这个答案很多小伙伴又会不解,先来说下第二个,Integer不是把-128至127缓存起来了吗?这不是应该是true嘛,但是你仔细看,这里的Integer是我们自己new出来的,并不是用的缓存,所以结果是false。 现在来看第一个为啥又是true了呢? 首先这里的值为1000,肯定和我们所知的Integer缓存没有关系。既然和缓存没有关系,a是新new出来的对象,按理说输入应该是false才对。但是注意b这里是int类型。当intInteger进行==比较的时候,Java会把Integer进行自动拆箱,也就是把Integer转成int类型,所以这里进行比较的是int类型的值,所以结果即为true

 

关于爱程序网 - 联系我们 - 广告服务 - 友情链接 - 网站地图 - 版权声明 - 人才招聘 - 帮助