Integer i1=140; Integer i2=140; System.out.println(i1==i2); Integer a1=127; Integer a2=127; System.out.println(a1==a2); int i3=140; int i4=140; System.out.println(i3==i4);
为什么第一个输出时false,后两个是true,int和Integer在存储的过程中的不同在于什么,如果第一个是false那么享元模式又怎么解释?如果说Integer存储的是类,那么为什么第二个是true
Integer是对象类型而int是原始类型,这个应该很好理解。
这里的赋值方式 如
Integer i1=140;
Integer i2=140;
其实是用来jdk的自动装箱,他们等价于
Integer i1 = Integer.valueOf(140);
Integer i2 = Integer.valueOf(140);
所以当比较i1==i2时,比较的是两个对象的引用地址,结果就是false.
那为什么下面的a1和a2又是true?
这里就是用到了享元模式,在Integer对象里,
-128-127之间的数值 会存在 一个 缓存池中,下次使用的时候 先从缓存池中 取出 这个数据 ,而不会去分配它的内存。
如果看一下Integer类的代码就明白了
public static Integer valueOf(int i) {
if(i >= -128 && i <= IntegerCache.high)
return IntegerCache.cache[i + 128];
else
return new Integer(i);
}
这里的IntegerCache.high,默认就是127,可以通过更改参数来设置更高的值。
所以这里的a1和a2,其实是Integer里的同一个缓存对象,当然比较的结果就是true了。