Java中相同代码的不同输出
我是java新手。我对包装器类和原始数据类型有所了解,但我遇到的情况令人惊讶。将变量i和j的值从1000更改为100时,输出将从false更改为true。我需要知道这背后的机制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
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);
}