自动装箱有点可怕。虽然我充分理解 ==
和.equals
之间的区别,但我仍无法避免以下错误:
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不总是自动取消装箱成原始类型?打印false false或true true会更好。
编辑
我不同意旧代码的失效。通过使foo.get(0) == bar.get(0)返回true,您已经破坏了代码。
这不能在编译器级别解决,只需在字节码中将Integer替换为int(只要它从未被分配为null)。