2012-05-08 10 views
6

Poniższy kod działa idealnie i dodaje 1 i 2 wartości do listy, ale dlaczego? Dlaczego nie trzeba jawnie tworzyć krótkich obiektów? np: list.add(new Short(1));Nie trzeba jawnie tworzyć krótkich obiektów?

List<Short> list = new ArrayList(); 
list.add((short)1); 
list.add((short)2); 
System.out.println(list); 

Odpowiedz

13

To się nazywa autoboxing. Jest to funkcja, która automatycznie konwertuje prymitywy na odpowiadający im typ obiektu. Jest obecna od wersji Java 1.5.

Przeciwieństwem autoboxing nazywa autounboxing ale uważaj NullPointerException

+1

+1 za ostrzeżenie o NPE. Aby było to wyraźne: 'list.add (null); short s = list.get (0); 'Uzyskanie zostanie w zasadzie skompilowane do' ((Short) list.get (0)). shortValue() ', które otrzyma' null', przesyła je do 'Short' i wyrzuć NPE na 'shortValue()'. – yshavit

1

To się nazywa autoboxing.

Należy pamiętać, że nadal będzie tworzyć prawdziwe obiekty Short automatycznie, a te zajmują 16 bajtów na stercie, tak samo jak obiekt Integer. Tylko natywne wartości short zajmują tylko 2 bajty (ale nie można ich umieścić w java.util.collections).

W wielu sytuacjach

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

będzie w rzeczywistości nawet tworzyć dwa takich obiektów, to jest 32 bajtów plus pamięć zajmowaną przez obiekt listy. Wskaźniki przechowywane na liście zajmują już po 4-8 bajtów.

Jeśli masz tylko kilka przypadków, które są w porządku. Jeśli masz kilka milionów, może to źle wpłynąć na wydajność z powodu zarządzania pamięcią i użytkowania. Z surowymi spodenkami zwykle możesz przejść 10 razy, zanim zacznie ci brakować wolnej pamięci.

+1

Powiedziałbym, że zazwyczaj potrzebujesz więcej niż "tysięcy", aby napotkać na poważne problemy z wydajnością – Buhb

Powiązane problemy