programowanieProgramista Backend

Wyjaśnij, jak działa mechanizm autoboxingu i unboxingu w Javie, jakie są jego ryzyka i gdzie może prowadzić do błędów wydajności lub logiki.

Zdaj rozmowy kwalifikacyjne z asystentem AI Hintsage

Odpowiedź.

Autoboxing — to automatyczne przekształcanie typów prymitywnych (int, double itd.) w odpowiadające im obiekty opakowujące (Integer, Double itd.). Unboxing — to odwrotne przekształcenie obiektu opakowującego z powrotem w typ prymitywny.

Działa automatycznie przy przypisywaniu, argumentach metod i w kolekcjach:

List<Integer> numbers = new ArrayList<>(); numbers.add(5); // Przykład autoboxingu: 5 (int) -> Integer(5) int value = numbers.get(0); // Unboxing: Integer(5) -> 5

Ryzyka:

  • Możliwy NullPointerException przy unboxingu null;
  • Nieefektywne wykorzystanie pamięci i czasu z powodu ciągłego tworzenia obiektów opakowujących;
  • Problemy z porównywaniem przy użyciu == (porównanie referencji) oraz equals.

Pytanie z haczykiem.

Czy poniższy kod może zgłosić wyjątek? Dlaczego?

Integer x = null; int y = x;

Odpowiedź: Kod zgłasza NullPointerException, ponieważ przy próbie wykonania int y = x; następuje unboxing z null na prymityw, a null nie może być przekształcone na int.

Przykłady rzeczywistych błędów z powodu nieznajomości szczegółów tematu.


Historia

Obliczenia sum w kolekcji opakowań Integer. Za każdym razem, gdy suma rosła, tworzono nowy obiekt Integer, co prowadziło do znacznych opóźnień na rzeczywistym serwerze zamiast używać int.

Historia

Programista użył Integer jako klucza do pamięci podręcznej, nie uwzględniając, że wartości -128...127 są buforowane, a pozostałe — nie. Z tego powodu == nagle zaczęło dawać błędne wyniki, co doprowadziło do nieprawidłowego usuwania danych z pamięci podręcznej.

Historia

W REST API przychodziły wartości nullable. Prosty unboxing przychodzącego Integer czasami prowadził do awarii z powodu niespodziewanego null zamiast liczby od klienta.