先看一个经典的面试题:
Java中的“==” 是比较两个对象的引用地址是否相同
Integer i1=127;
Integer i2=127;
System.out.println(i1==i2); //输出true
当值大于127时,不会从常量池中取对象,这种情况相当于new了两个新对象,地址不同
Integer i3=128;
Integer i4=128;
System.out.println(i1==i2); //输出false
下面来简单说下Integer类型的缓存机制:
直接上源码················
IntegerCache是Integer 类中的内部静态类,最后一行,私有化了构造函数,内部类中有low(默认为-128)和high两个常量,static静态块中,先设置high(默认为127)的值,
然后创建了值为-128到127 的所有Integer对象(默认low:-128,high: 127)
Integer.valueOf
valueOf方法判断了i的范围,low <= i <= high 时取缓存中过值,否则创建新的对象。
说到这里可能有人不明白了, Integer i = 100 , 跟这个valueOf 方法有什么关系?
这就涉及到Java中的装箱和拆箱