摘自:https://www.dutycode.com/xijie_baozhuanglei_huancun_jizhi_integer_huancun.html
Integer的缓存机制: Integer是对小数据(-128~127)是有缓存的,再jvm初始化的时候,数据-128~127之间的数字便被缓存到了本地内存中,如果初始化-128~127之间的数字,会直接从内存中取出,不需要新建一个对象.
public static void main(String[] args) {
Integer num1 = new Integer(100);
Integer num2 = new Integer(100);
System.out.println("num1==num2 " + (num1 == num2));
Integer num3 = 100;
Integer num4 = 100;
System.out.println("num3==num4 " +(num3 == num4));
Integer num5 = 128;
Integer num6 = 128;
System.out.println("num5==num6 " + (num5 == num6));
Integer num7 = 100;
Integer num8 = new Integer(100);
System.out.println("num7==num8 " + (num7 == num8));
int num9 = 100;
Integer num10 = new Integer(100);
Integer num11 = 100;
System.out.println("num9==num10 " + (num9 == num10));
System.out.println("num9==num11 " + (num9 == num11));
}
//运行之后的输出结果是:
//num1==num2 false
//num3==num4 true
//num5==num6 false
//num7==num8 false
//num9==num10 true
//num9==num11 true
-
num1==num2 false
num1和num2的内存地址不一样,==的左右操作数如果是对象的话,那么比较的是引用的地址,new产生的对象一定是新的内存地址,所以,这里和Integer的缓存机制无关的,最终的结果便是false -
num3==num4 true
num3和num4的初始化方式,直接将数字赋值,等价于下面:
Integer num3 = Integer.valueOf(100);
Integer的缓存机制: Integer是对小数据(-128~127)是有缓存的,再jvm初始化的时候,数据-128~127之间的数字便被缓存到了本地内存中,如果初始化-128~127之间的数字,会直接从内存中取出,不需要新建一个对象.
所以,num3和num4实际上是引用的是一个内存地址,那么就是true了。
-
num5==num6 false
同上解析,128已经不在-128~127之间了,所以会new新对象,那么就是false -
num7==num8 false
因为num8是new出来的,所以使用的内存地址和num7不一致,结果为false -
num9==num10 true
num9的类型是int。Integer是int的包装类,在和int做比较的时候,会自动拆箱成int数值类型,所以,这里便变成了数字(int)的比较。 -
num9==num11 true
看清,num9 和 num11 .原理同上