2011-08-19 17 views

Odpowiedz

12

Pierwsze kilka zdań oddelegowanego artykule opisać to całkiem dobrze:

nie można umieścić int (lub inną wartość prymitywną) do kolekcji. Kolekcje mogą przechowywać tylko odniesienia do obiektów, więc musisz wprowadzić wartości pierwotne do odpowiedniej klasy opakowania (która jest liczbą całkowitą w przypadku int). Gdy usuniesz obiekt z kolekcji, otrzymasz liczbę całkowitą, którą wstawisz; jeśli potrzebujesz int, musisz rozpakować Integer za pomocą metody intValue. Całe to boksowanie i rozpakowywanie jest uciążliwe i podkręca twój kod. Funkcja autoboxing i unboxing automatyzuje proces, eliminując ból i bałagan.

To jest w zasadzie to w pigułce. Pozwala to na skorzystanie z programu Kolekcje dla prymatów bez konieczności samodzielnego wykonywania pracy.

Podstawową wadą jest to, że myli nowych programistów i może prowadzić do bałaganu/mylącego kodu, jeśli nie jest on zrozumiany i używany poprawnie.

8

Java obsługującym autoboxing i automatycznie zawija wartości prymitywnych do obiektów i rozpakowuje obiektów do pierwotnych wartości dla niektórych typów, jak char - Character, int - Integer , double - Double, itp.

Uwaga od Oracle Documentation:

Więc kiedy powinieneś używać autoboxing i unboxing? Używaj ich tylko wtedy, gdy występuje "niedopasowanie impedancji" pomiędzy typami odniesienia i prymitywami, na przykład, gdy musisz umieścić wartości liczbowe w kolekcji. Nie jest właściwe stosowanie autoboxingu i rozpakowywania w przypadku obliczeń naukowych lub innych kodów numerycznych wrażliwych na wydajność. Liczba całkowita nie jest substytutem int; autoboxing i unboxing zamazują rozróżnienie między typami pierwotnymi i referencyjnymi, ale nie eliminują go.

0

Oprócz innych odpowiedzi, ponieważ Integer jest klasą opakowania, która umożliwia zapisanie i rozwinięcie wartości int. Inne informacje: here.

1

"Zamiennie" oznacza "autoboxing". Ta funkcja została wprowadzona w języku Java 5. Wcześniej Twój przykładowy kod nie zostałby skompilowany.Zamiast tego, trzeba by napisać coś takiego:

Integer b = Integer.valueOf(42); // or new Integer(42); 
int a = b.intValue(); 

lub

int d = 12; 
Integer c = Integer.valueOf(d); // or new Integer(d); 

To dość rozwlekły, dlatego autoboxing został wprowadzony. To trochę magii kompilatora, aby ułatwić życie koderowi.

Same z siebie nie są wymienne i nie można ich używać tam, gdzie jest to wymagane. Jednak autoboxing umożliwia niejawną konwersję między tymi dwoma.

Na marginesie, istnieje jeden przypadek, w którym autoboxing (w szczególności unboxing) nie powiedzie się. Jeśli kod usiłuje autounbox wartość null, dostaniesz NullPointerException w czasie wykonywania, np .:

Integer b = null; 
int a = b; // NullPointerException here! 

tylko coś być świadomi ...

Powiązane problemy