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