84669 Lernen von Personen
152542 Lernen von Personen
20005 Lernen von Personen
5487 Lernen von Personen
7821 Lernen von Personen
359900 Lernen von Personen
3350 Lernen von Personen
180660 Lernen von Personen
48569 Lernen von Personen
18603 Lernen von Personen
40936 Lernen von Personen
1549 Lernen von Personen
1183 Lernen von Personen
32909 Lernen von Personen
System.out.println(i3==i4), warum das Ausgabeergebnis nicht wahr ist
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是新创建的对象