2012-05-08 19 views
6

以下代碼完美無缺,並將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); 

回答

13

這叫做autoboxing。它是一種自動將基元轉換爲相應對象類型的功能。它自Java 1.5以來就存在了。

自動裝箱的相反稱爲autounboxing但空指針異常

+1

+1關於NPE的警告。爲了明確它:'list.add(null); short s = list.get(0);'get將基本上編譯爲'((Short)list.get(0))。shortValue()',它將得到'null',將其轉換爲'Short' ,並在'shortValue()'上拋出一個NPE。 – yshavit

1

這被稱爲自動裝箱的提防。

請注意,它仍然會自動創建真實的Short對象,並且這些對象佔用堆中的16個字節,與Integer對象相同。只有本地short值只佔用2個字節(但不能放入java.util.collections)。

在許多情況下

list.put((short) 12345); 
list.put((short) 12345); 

將實際上甚至創建這樣的對象,即32個字節加上由列表對象所佔用的存儲器。存儲在列表中的指針已經佔用每個4-8字節。

如果你只有幾個沒有問題的實例。如果你有幾百萬,這可能會由於內存管理和使用而嚴重影響性能。在短褲之前,通常可以在變慢或耗盡內存之前進行10次。

+1

我想說,通常情況下,您可能需要超過「數千」才能遇到重大性能問題 – Buhb