2

我是java新手。我对包装类和原始数据类型有所了解,但我遇到的情况令人惊讶。将变量 i 和 j 的值从 1000 更改为 100 时,输出从 false 更改为 true。我需要知道这背后的机制。

class Demo{
    public static void main(String[] args){
        Integer i=1000,j=1000;
        if(i==j)
            System.out.println("true");
        else
            System.out.println("false");
    }
}

上面的代码给了我“假”,而..

class Demo{
    public static void main(String[] args){
        Integer i=100,j=100;
        if(i==j)
            System.out.println("true");
        else
            System.out.println("false");
    }
}

上面的代码给了我“真实”

4

3 回答 3

11

包装类中的缓存

Integer 具有内部缓存,用于范围从 -128 到 127 的值。

所以对于这个范围内的数字,Integer返回相同的实例。 ==按实例比较,因此相同的实例用于100.

源 JDK 1.6:

public static Integer valueOf(int i) {
    final int offset = 128;
    if (i >= -128 && i <= 127) { // must cache 
        return IntegerCache.cache[i + offset];
    }
        return new Integer(i);
    }

封装类 Java 中的缓存

缓存的目的

目的主要是为了节省内存,由于更好的缓存效率,这也导致代码更快。

.equals在比较值而不是身份时使用

如果要比较两个Integers,则应该i.equals(j)像正确比较Strings 的值一样使用。还要记住,任何将拆箱的操作都会Integer隐式调用 Integer.intValue(),因此请记住仔细进行这些调用,知道您何时Integer可能为空。

于 2013-09-18T08:05:14.770 回答
1

要比较对象的内容(而不是它们的身份),请使用equals而不是==. 这将给出一致的结果。

于 2013-09-18T08:08:55.457 回答
0

Wrapper 类Integer具有 -127 到 127 的内部缓存。因此,当您分配在此范围内的相同值时,将返回相同的实例。对于 1000,返回两个不同的“新”实例,在 == 比较时给出错误。

如果您使用int而不是Integer,结果不会令人惊讶。为了与您的方法保持一致的结果,请使用equals()method 而不是==.

于 2013-09-18T08:09:26.513 回答