Java中相同代码的不同输出

Aka*_*pta 2 java wrapper

我是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");
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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");
    }
}
Run Code Online (Sandbox Code Playgroud)

上面的代码给我"真实"

Nar*_*hai 10

在包装类中缓存

整数具有内部缓存,其值范围为-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);
    }
Run Code Online (Sandbox Code Playgroud)

在包装类Java中缓存

缓存的目的

目的主要是节省内存,由于更好的缓存效率,这也可以带来更快的代码.

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

如果你要比较两个Integers,你应该i.equals(j)像正确比较Strings 的值那样使用.另外请记住,任何将取消打包的操作都会Integer进行隐式调用 Integer.intValue(),因此请记住仔细调用这些调用,知道何时Integer可能为null.