System.out.println(i3==i4),为什么输出的结果不是true
class Demo { public static void main(String[] arge) { Integer i1=100; Integer i2=100; Integer i3=200; Integer i4=200; System.out.println(i1==i2); System.out.println(i3==i4); } }
人生最曼妙的风景,竟是内心的淡定与从容!
首先我们知道,对象类型在做==时是比较其引用的内存地址。所以在楼主这个demo中,原则上i1==i2,i3==i4比较的都是其引用的内存地址,应该都是false。但是,java在java5引入了Integer缓存机制,当开发者使用Integer类型时,如果定义的值在-128~127之间时,会将引用直接指向已创建好的缓存对象。
在楼主的demo中,i1,i2两个变量在-128~127之间,所以两个变量的引用是指向同一个对象实例(内存地址相同),所以返回true,而i3,i4两个变量的值不在-128~127之间,所以jvm分别为这两个自动装箱的对象类型,创建了新的对象实例(内存地址不同),所以返回false。
Integer缓存机制的最大值可以通过jvm参数-XX:AutoBoxCacheMax=size来调整。有关Integer整型的细节及原理,请参考这篇博客。http://blog.csdn.net/u0110040...
整形包装类会缓存0-150的整数对象,所以小于150都会在装箱时候使用缓存,100是缓存中对象,200是新创建的对象
首先我们知道,对象类型在做==时是比较其引用的内存地址。所以在楼主这个demo中,原则上i1==i2,i3==i4比较的都是其引用的内存地址,应该都是false。但是,java在java5引入了Integer缓存机制,当开发者使用Integer类型时,如果定义的值在-128~127之间时,会将引用直接指向已创建好的缓存对象。
在楼主的demo中,i1,i2两个变量在-128~127之间,所以两个变量的引用是指向同一个对象实例(内存地址相同),所以返回true,而i3,i4两个变量的值不在-128~127之间,所以jvm分别为这两个自动装箱的对象类型,创建了新的对象实例(内存地址不同),所以返回false。
Integer缓存机制的最大值可以通过jvm参数-XX:AutoBoxCacheMax=size来调整。有关Integer整型的细节及原理,请参考这篇博客。http://blog.csdn.net/u0110040...
整形包装类会缓存0-150的整数对象,所以小于150都会在装箱时候使用缓存,100是缓存中对象,200是新创建的对象