先来看一题
public class Test { public static void main(String[] args){ Integer i1 = 2; Integer i2 = 2; Integer i3 = 200; Integer i4 = 200; System.out.println(i1==i2); System.out.println(i3==i4); } }
运行结果是
为什么会出现一个false 一个true?
首先Integer i1 = 2;它是一个装箱过程为Integer i1 = Integer.valueOf(2);
看Integer.valueOf(int)源码:
IntegerCache.low = -128 ;IntegerCache.hight = 127
public static Integer valueOf(int i) { if (i >= IntegerCache.low && i <= IntegerCache.high) return IntegerCache.cache[i + (-IntegerCache.low)]; return new Integer(i); }![]()
它是先从缓存中拿,缓存了中存放了-128-127的Integer
当传递来的i属于[-128,127]就从缓存中拿,不属于这个范围就new,
从缓存拿出来的是同一对象就相等,new出来的不是同一对象当然就不等。
看Integer缓存的代码
low = -128 high = 127
cache = new Integer[(high - low) + 1]; int j = low; for(int k = 0; k < cache.length; k++) cache[k] = new Integer(j++);
类似的还有缓存还有Long[-128,127], Byte[-128,127]
为什么jdk要提供缓存?
因为从缓存中拿比直接new性能要好,new对象是很耗性能的。