以下代碼完美無缺,並將1和2的值添加到列表中,但爲什麼? 爲什麼不需要明確創建Short對象?例如:list.add(new Short(1));
不需要明確創建短對象嗎?
List<Short> list = new ArrayList();
list.add((short)1);
list.add((short)2);
System.out.println(list);
以下代碼完美無缺,並將1和2的值添加到列表中,但爲什麼? 爲什麼不需要明確創建Short對象?例如:list.add(new Short(1));
不需要明確創建短對象嗎?
List<Short> list = new ArrayList();
list.add((short)1);
list.add((short)2);
System.out.println(list);
這叫做autoboxing。它是一種自動將基元轉換爲相應對象類型的功能。它自Java 1.5以來就存在了。
自動裝箱的相反稱爲autounboxing但空指針異常
這被稱爲自動裝箱的提防。
請注意,它仍然會自動創建真實的Short
對象,並且這些對象佔用堆中的16個字節,與Integer對象相同。只有本地short
值只佔用2個字節(但不能放入java.util.collections
)。
在許多情況下
list.put((short) 12345);
list.put((short) 12345);
將實際上甚至創建這樣的對象,即32個字節加上由列表對象所佔用的存儲器。存儲在列表中的指針已經佔用每個4-8字節。
如果你只有幾個沒有問題的實例。如果你有幾百萬,這可能會由於內存管理和使用而嚴重影響性能。在短褲之前,通常可以在變慢或耗盡內存之前進行10次。
我想說,通常情況下,您可能需要超過「數千」才能遇到重大性能問題 – Buhb
+1關於NPE的警告。爲了明確它:'list.add(null); short s = list.get(0);'get將基本上編譯爲'((Short)list.get(0))。shortValue()',它將得到'null',將其轉換爲'Short' ,並在'shortValue()'上拋出一個NPE。 – yshavit