可能重复:
Weird Java Boxing
public class example {
public static void main(String[] args) {
Integer a=127,b=127;
if(a==b)
System.out.println("Equal");
else
System.out.println("Not Equal");
Integer c=128,d=128;
if(c==d)
System.out.println("Equal");
else
System.out.println("Not Equal");
}
}
输出:
Equal
Not Equal
答案 0 :(得分:5)
基本上-127到127之间的整数以这种方式“缓存” 当你使用这些数字时,你总是引用相同的数字 记忆,这就是你的==工作的原因。
该范围之外的任何整数都不会被缓存,因此引用 不一样。
因此,当您尝试将127与127进行比较时,只有一个对象 制作完成并且工作正常,但当你尝试使用128时,它就出现了 范围和它创建了两个对象,因此您无法使用它们进行比较 ==运营商。
为此目的,使用 .equals()(比较对象引用)方法。请参阅 this了解更多详情。
Integer c=128,d=128;
if(c.equals(d))
System.out.println("Equal");
else
System.out.println("Not Equal");
答案 1 :(得分:0)
这是因为范围[-128,127]内的Integer
个数字存储在堆中。因此,当您比较对象引用而不是对象值时,Integer a = 127
和Integer b = 127
都指向堆中的同一对象,您的表达式将被计算为true
。
当Integer
值超出该范围时,您将获得两个不同的对象,因此引用比较将返回false
答案 2 :(得分:0)
从Integer.java的源代码
private static class IntegerCache {
private IntegerCache(){}
static final Integer cache[] = new Integer[-(-128) + 127 + 1];
static {
for(int i = 0; i < cache.length; i++)
cache[i] = new Integer(i - 128);
}
}
/**
* Returns a <tt>Integer</tt> instance representing the specified
* <tt>int</tt> value.
* If a new <tt>Integer</tt> instance is not required, this method
* should generally be used in preference to the constructor
* {@link #Integer(int)}, as this method is likely to yield
* significantly better space and time performance by caching
* frequently requested values.
*
* @param i an <code>int</code> value.
* @return a <tt>Integer</tt> instance representing <tt>i</tt>.
* @since 1.5
*/
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);
}