Sobes.tech
Junior

Czym są klasy opakowujące (Wrapper classes) w Java?

sobes.tech AI

Odpowiedź od AI

Klasy opakowujące w Javie to klasy, które zapewniają obiektową reprezentację typów danych prymitywnych. Umożliwiają one używanie wartości prymitywnych w kontekstach, gdzie wymagane są obiekty, na przykład w kolekcjach lub podczas pracy z wielowątkowością.

Główne klasy opakowujące:

  • Byte
  • Short
  • Integer
  • Long
  • Float
  • Double
  • Boolean
  • Character

Przykłady użycia:

Użycie typu prymitywnego:

// Typ prymitywny
int x = 10;

Użycie klasy opakowującej:

// Klasa opakowująca
Integer y = new Integer(20); // Przestarzały sposób tworzenia
Integer z = 30; // Autoboxing (automatyczne przekształcenie prymitywu w obiekt)

Konwersja między prymitywami a obiektami opakowującymi:

  • Autoboxing: Automatyczne przekształcenie prymitywu w obiekt opakowujący.
    // Autoboxing
    int primitiveInt = 100;
    Integer wrapperInt = primitiveInt;
    
  • Unboxing: Automatyczne przekształcenie obiektu opakowującego w prymityw.
    // Unboxing
    Integer wrapperInteger = new Integer(200);
    int primitiveInteger = wrapperInteger;
    

Zalety klas opakowujących:

  • Praca z kolekcjami: Kolekcje (List, Set, Map) przechowują tylko obiekty.
  • Praca z null: Obiekty opakowujące mogą mieć wartość null, w przeciwieństwie do prymitywów.
  • Udostępniają przydatne metody: Klasy opakowujące mają metody do konwersji łańcuchów, porównywania wartości itp. Na przykład Integer.parseInt(String s).
  • Praca z generykami: Generyki działają tylko z obiektami.

Wady klas opakowujących:

  • Zużycie pamięci: Obiekty opakowujące zajmują więcej pamięci niż prymitywy.
  • Spadek wydajności: Automatyczne przekształcanie (autoboxing i unboxing) może nieznacznie obniżyć wydajność.

Przykład użycia w kolekcji:

import java.util.ArrayList;
import java.util.List;

public class WrapperExample {
    public static void main(String[] args) {
        List<Integer> numbers = new ArrayList<>();
        numbers.add(10); // Autoboxing
        numbers.add(new Integer(20)); // Jawne tworzenie obiektu

        int firstNum = numbers.get(0); // Unboxing
        System.out.println(firstNum);
    }
}