Integer和int深入理解。

		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了。

原文地址:https://www.cnblogs.com/xhk1228/p/3315508.html