我是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)
目的主要是节省内存,由于更好的缓存效率,这也可以带来更快的代码.
.equals比较值时使用,而不是身份如果你要比较两个Integers,你应该i.equals(j)像正确比较Strings 的值那样使用.另外请记住,任何将取消打包的操作都会Integer进行隐式调用 Integer.intValue(),因此请记住仔细调用这些调用,知道何时Integer可能为null.