我是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");
}
}
上面的代码给我“真实”
答案 0 :(得分:10)
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);
}
Caching in wrapper classes Java
目的主要是 save memory ,由于更好的缓存效率,这也可以带来更快的代码。
.equals
,而不是身份如果您要比较两个Integer
,则应使用i.equals(j)
,就像正确比较String
s的值一样。另请注意,将Integer
取消隐藏的任何操作都会对Integer.intValue()
进行隐式调用,因此请务必仔细进行这些调用,了解您的Integer
何时可能为空。
答案 1 :(得分:1)
要比较对象的内容(而不是其身份),请使用equals
代替==
。这将产生一致的结果。
答案 2 :(得分:0)
包装类Integer
具有-127到127的内部缓存。因此,当您指定在此范围内的相同值时,将返回相同的实例。对于1000,返回两个不同的'新'实例,在==比较时给出错误。
如果您使用int
代替Integer
,结果就不会令人惊讶。要获得与您的方法一致的结果,请使用equals()
方法而不是==
。