5

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

为什么?

4

2 回答 2

12

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

自动装箱缓存原语到对象的转换。较小的值获得相同的对象,较大的值不会。

注意:虽然始终缓存 -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

我觉得很奇怪

我知道你读这个问题的意思。;)

于 2012-08-09T11:21:17.150 回答
4

它缓存int值 -128 和 127(含),因此它将引用该范围内内存中的相同实例

当您将原始值传递给(此处10

System.identityHashCode(10);

它将它自动装箱为Integer对象,然后使用valueOf()Integer 类的方法进行转换

例如

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

也可以看看

于 2012-08-09T11:20:21.423 回答