Short, Integer, Long缓存
Integer intA = 127; Integer intB = 127; Integer intC = 128; Integer intD = 128; System.out.println(intA == intB); //true System.out.println(intC == intD); //false
Integer里弄了一个缓存,对于在 -128 ~ 127 之间的数值,会直接使用该缓存里的对象
也就是说 Integer intA = 127 或者 Integer intA = Integer.valueOf(127) ,最终 intA 得到的是Integer里的缓存对象
同理,intB也是获得该相同对象因此 进行 intA == intB 比较时,intA和intB引用的是同一个对象,因此就true
而对于128,已经超出缓存范围了,因此会生成一个新的Integer对象, intC和intD就引用不同的对象了,进行==比较,当然就false了.
但是如果new Integer() 则直接创建一个新的对象, 并不会到缓存中取.
Integer i3 = new Integer(100); Integer i4 = new Integer(100); System.out.println("i3 == i4: "+(i3 == i4)); //false
Integer的cache是configurable的, -Djava.lang.Integer.IntegerCache.high=1000可以改变cache的最大值, 最小值不能config固定为-128
//java option中加入-Djava.lang.Integer.IntegerCache.high=1000 Integer i3 = new Integer(500); Integer i4 = new Integer(500); System.out.println("i3 == i4: "+(i3 == i4)); //true
对于Short Long也有相同的缓存, 默认的也是缓存-128 ~ 127 之间的数值, 但其缓存不可以更改最大值.
封装类对象和基本数据类型==比较, 则会将封装类对象自动转成基本类型后比较,即值比较;
Integer i4 = new Integer(5000); int i5 = 5000; System.out.println("i4 == i5: "+(i4 == i5)); //true