为什么编译器/JVM不能让自动装箱“正常工作”?
2022-09-04 06:25:48
自动装箱是相当可怕的。虽然我完全理解之间的区别,但我不能不帮助有以下错误,地狱出我:==
.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并不总是自动取消装箱到原始?
打印假假或真真会更好。
编辑
我不同意旧代码的破损。通过返回 true,您已经破解了代码。foo.get(0) == bar.get(0)
这不能在编译器级别通过在字节代码中用int替换Integer来解决(只要它从未被赋值为null)