Java Wrapper相等测试

public class WrapperTest { public static void main(String[] args) { Integer i = 100; Integer j = 100; if(i == j) System.out.println("same"); else System.out.println("not same"); } } 

上面的代码在运行时给出same的输出,但是如果我们将ij的值更改为1000,则输出变为not same 。 在我为SCJP做准备时,需要明确这个概念。 有人可以解释这种行为。谢谢。

在Java中,-128和127(包括)之间的整数通常由相同的Integer对象实例表示。 这是通过使用一个名为IntegerCache的内部类(包含在Integer类中,并在调用Integer.valueOf()时或在自动装箱期间使用)来处理的:

 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); } } 

另见: http : //www.owasp.org/index.php/Java_gotchas

基本上-127和127之间的整数是“缓存”的,这样当你使用这些数字时,你总是在内存中引用相同的数字,这就是你的==有效的原因。

超出该范围的任何整数都不会被缓存,因此引用不相同。

@tunaranch是对的。 它也与此Python问题中的问题相同 。 要点是Java为-128到127之间的整数保留了一个对象(Python确实为-5到256)并且每次请求时都返回相同的对象。 如果你要求在这个固定范围之外的整数,它每次都会给你一个新的对象。

(回想一下, ==返回两个对象是否实际相同,而equals比较它们的内容。)

编辑 :这是Java语言规范的 5.1.7节中的相关段落:

如果被装箱的值ptruefalse ,一个byte ,范围为\u0000\u007fchar ,或者介于-128和127之间的int或短号,则让r1r2为任意两次装箱转换的结果of p。 始终是r1 == r2的情况。

请注意,这也描述了其他类型的情况。

这与平等和自动装箱有关: http ://web.archive.org/web/20090220142800/http://davidflanagan.com/2004/02/equality-and-autoboxing.html

您的代码无法编译。 这就是我得到的:

线程“main”中的exceptionjava.lang.Error:未解决的编译问题:类型不匹配:无法从int转换为Integer类型不匹配:无法从int转换为Integer

 at WrapperTest.main(WrapperTest.java:5) 

变量i和j是Integer对象的实例。 不要使用“==”运算符比较对象的实例,而是使用“equals”方法。

问候