在Java中为相同代码包装不同的输出
我是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”
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");
}
}
上面的代码告诉我“true”
# 1 楼答案
包装类中的缓存
对于-128到127之间的值,Integer具有内部缓存
因此,对于此范围内的数字,将返回相同的
Integer
实例==
按实例进行比较,因此相同的实例用于100
源JDK 1.6:
Caching in wrapper classes Java
缓存的目的
其目的主要是节省内存,这也会由于更好的缓存效率而导致更快的代码
比较值时使用
.equals
,而不是标识如果要比较两个
Integer
,应该使用i.equals(j)
,就像正确比较String
的值一样。还要记住,任何将取消对Integer
的装箱的操作都会对Integer.intValue()
进行隐式调用,因此记住要小心进行这些调用,要知道Integer
的值可能为空# 2 楼答案
要比较对象的内容(而不是它们的标识),请使用
equals
而不是==
。这将产生一致的结果# 3 楼答案
包装类
Integer
具有-127到127的内部缓存。因此,当您分配相同的值时,该范围内的值将返回相同的实例。对于1000,返回两个不同的“new”ed实例,给出false on==comparison如果使用
int
而不是Integer
,结果将不会令人惊讶。为了使结果与您的方法一致,请使用equals()
方法而不是==