为什么相同的整数值在Java中具有不同的内存地址?

时间:2012-08-09 11:18:21

标签: java memory

今天是我第一次尝试使用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时,它会变成相同的结果。

为什么?

2 个答案:

答案 0 :(得分:12)

  

但是当我将500改为50时,它会变成相同的结果。

Autoboxing缓存基元到Object的转换。小值得到相同的对象,较大的值则没有。

注意:虽然始终缓存介于-128和127之间的值,但可以根据命令行设置缓存更高的值。有关详细信息,请参阅Integer的来源。

这也称为Flyweight Pattern


您可以使用

设置整数缓存的最大大小
-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;
已获得缓存实现的

Integer.valueOf()

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];

另见