Java中相同代码的不同输出

Java中相同代码的不同输出,java,wrapper,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

我是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");
    }
}
上面的代码在..时给了我“false”

上面的代码为我提供了包装类中的“true”

缓存 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);
    }
公共静态整数值(int i){
最终整数偏移=128;

如果(i>=-128&&i比较对象的内容(而不是它们的标识)使用
equals
而不是
=
。这将提供一致的结果。

包装类
Integer
具有内部缓存,用于-127到127。因此,当您分配此范围内的相同值时,将返回相同的实例。对于1000,将返回两个不同的“新建”实例,并给出false on==comparison


如果您使用
int
而不是
Integer
,结果将不会令人惊讶。要使结果与您的方法一致,请使用
equals()
方法而不是
==

每天都会出现这个或类似的问题。这是某个texbook示例吗?我在实际编程中从未遇到过这个问题。可能重复@OrhanC1查看添加您编辑的问题,看起来您添加了盈余}@啊!你说得对。对不起。没问题,回答很好,我只是想说清楚,以防不明显。我想知道谁选择了这个值范围(-128到127),为什么?为什么不选择更高的范围?
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);
    }