今天是我第一次尝试使用Java语言。当我尝试这段代码时,我感到非常奇怪:
int a =500;
System.out.println(System.identityHashCode(500));
System.out.println(System.identityHashCode(500));
System.out.println(System.identityHashCode(a));
System.out.println(System.identityHashCode(a));
所有这些结果都不同。但是当我将500改为50时,它会变成相同的结果。
为什么?
答案 0 :(得分:12)
但是当我将500改为50时,它会变成相同的结果。
Autoboxing缓存基元到Object的转换。小值得到相同的对象,较大的值则没有。
注意:虽然始终缓存介于-128和127之间的值,但可以根据命令行设置缓存更高的值。有关详细信息,请参阅Integer
的来源。
您可以使用
设置整数缓存的最大大小-Djava.lang.Integer.IntegerCache.high=NNNN
-XX:AutoBoxCacheMax=NNNN
-XX:+AggressiveOpts // sets it higher depending on the version e.g. 10000
http://martykopka.blogspot.co.uk/2010/07/all-about-java-integer-cache.html
http://www.javaspecialists.eu/archive/Issue191.html
我觉得很奇怪
我知道你读这个问题的意思。 ;)
答案 1 :(得分:4)
它缓存int
值-128和127(包括),因此它将引用该范围内的同一实例
将原始值传递给(此处10
)
System.identityHashCode(10);
它将它自动装箱到Integer
对象,并且它使用Integer类的valueOf()
方法进行转换
例如
Integer a = 10;
将转换为内部使用valueOf()
1: invokestatic #2; //Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
已获得缓存实现的
public static Integer valueOf(int i) {
if(i >= -128 && i <= IntegerCache.high)
return IntegerCache.cache[i + 128];
else
return new Integer(i);
}
因此,如果您将值从-128传递到127(包括),它将使用缓存版本,如您所见
if(i >= -128 && i <= IntegerCache.high)
return IntegerCache.cache[i + 128];
另见