Autoboxing是相当可怕的。虽然我完全理解==
和.equals
之间的区别我不能不帮助有后续错误的地狱了我:为什么编译器/ JVM不能让自动装箱“只是工作”?
final List<Integer> foo = Arrays.asList(1, 1000);
final List<Integer> bar = Arrays.asList(1, 1000);
System.out.println(foo.get(0) == bar.get(0));
System.out.println(foo.get(1) == bar.get(1));
,打印
true
false
他们为什么这样做这种方式?这与缓存的整数有关,但如果是这种情况,为什么不缓存该程序使用的所有整数?或者为什么JVM不总是自动取消原始的框?
打印错误的假或真的真的会更好。
编辑
我不同意有关的旧代码破损。通过让foo.get(0) == bar.get(0)
返回true,您已经破坏了代码。
不能在此可以在编译器级别由字节码与诠释更换整数(只要它永远不会赋值为null)
它只是工作!不是你期望的方式;) – OscarRyz 2010-04-08 19:14:33
实际上你的例子与自动装箱无关,它的行为早于它。确实,自动装箱迫使我们更加意识到它:equals()是比较对象的(通常是正确的)方式,==是比较原语的(唯一)方法... autoboxing帮助程序员处理Integer和int (几乎)可以互换......因此存在bug的危险。 – leonbloy 2010-04-08 19:18:22
这可能是由于也影响String实例的大小写。就我所了解的情况而言,根据价值在幕后发生了一些联营活动。这可以通过使用'new'关键字来防止。 – 2010-04-08 19:33:23