前面说了String类型的赋值方式,那么数字类型呢?下面我就拿Integer解析:
先看下面一段代码:
如果看了前面的对String的讨论,可能大家会质疑c1 == c2的答案,但真实结果就是如此,为什么呢?
看看Debug出来的结果,c1、c2与d1、d2组合的Integer后面的id都是不同的,虽然我并不清楚这个id标志的是什么,但是id,字面意思就是身份标识,既然身份标识不一样,肯定不是同一个人了,最多就是同名的人罢了但是身份证(ID)永远是不同的。
再看看Integer对int的处理方法:
Integer.class -- valueOf(int i)
IntegerCache.class
所以对于c1 == c2 为 false我们也基本有了答案了,与String不同,JDK编译器在程序运行时就把某个范围的数字预编译放进缓冲区(在IntegerCache类中通过静态变量的方式声明,并初始化了值),而不是像String那样在第一次创建对象时创建相应的缓存,在第二次采用原型赋值方式时,就首先从缓冲区拿。
所以Integer num = value,当value不在-128~127这个范围区间时,他就通过new创建不同的对象;当value符合那个区间时,就从开始静态数组中(缓存区)拿,故不会产生新的对象。这估计也是JDK对于内存和效率权衡后确定的范围。