Wrapper-Klassen in Java

1. Übersicht

Wie der Name schon sagt, sind Wrapper-Klassen Objekte, die primitive Java-Typen einkapseln.

Jedes Java-Grundelement hat einen entsprechenden Wrapper:

  • Boolean, Byte, Short, Char, Int, Long, Float, Double
  • Boolean, Byte, Short, Character, Integer, Long, Float, Double

Diese sind alle im Paket java.lang definiert , daher müssen sie nicht manuell importiert werden.

2. Wrapper-Klassen

"Was ist der Zweck einer Wrapper-Klasse?" Dies ist eine der häufigsten Fragen zu Java-Interviews.

Grundsätzlich funktionieren generische Klassen nur mit Objekten und unterstützen keine Grundelemente . Wenn wir mit ihnen arbeiten möchten, müssen wir daher primitive Werte in Wrapper-Objekte konvertieren.

Beispielsweise arbeitet das Java Collection Framework ausschließlich mit Objekten. Vor langer Zeit, als (vor Java 5, vor fast 15 Jahren) kein Autoboxing vorhanden war und wir beispielsweise nicht einfach add (5) für eine Sammlung von Ganzzahlen aufrufen konnten .

Zu diesem Zeitpunkt mussten diese primitiven Werte manuell in entsprechende Wrapper-Klassen konvertiert und in Sammlungen gespeichert werden.

Heute können wir mit Autoboxing problemlos ArrayList.add (101) ausführen, aber Java konvertiert den primitiven Wert intern in eine Ganzzahl, bevor er mit der valueOf () -Methode in der ArrayList gespeichert wird .

3. Primitive to Wrapper-Klassenkonvertierung

Die große Frage ist nun: Wie konvertieren wir einen primitiven Wert in eine entsprechende Wrapper-Klasse, z. B. ein int in Integer oder ein char in Character?

Nun, wir können entweder Konstruktor- oder statische Factory-Methoden verwenden, um einen primitiven Wert in ein Objekt einer Wrapper-Klasse zu konvertieren.

Ab Java 9 sind Konstruktoren für viele Boxed-Primitive wie Integer oder Long jedoch veraltet.

So ist es sehr nur empfohlen , um die Fabrikmethoden auf neuen Code zu verwenden .

Sehen wir uns ein Beispiel für die Konvertierung eines int- Werts in ein Integer- Objekt in Java an:

Integer object = new Integer(1); Integer anotherObject = Integer.valueOf(1);

Die Methode valueOf () gibt eine Instanz zurück, die den angegebenen int- Wert darstellt.

Es gibt zwischengespeicherte Werte zurück, was es effizient macht. Es werden immer Werte zwischen -128 und 127 zwischengespeichert, es können jedoch auch andere Werte außerhalb dieses Bereichs zwischengespeichert werden.

In ähnlicher Weise können wir auch Boolean in Boolean, Byte in Byte, char in Character, long in Long, float in Float und double in Double konvertieren . Wenn wir String in Integer konvertieren müssen, müssen wir die parseInt () -Methode verwenden, da String keine Wrapper-Klasse ist.

Zum Konvertieren von einem Wrapper-Objekt in einen primitiven Wert können wir die entsprechende Methode wie intValue (), doubleValue () usw.: Verwenden.

int val = object.intValue(); 

Eine umfassende Referenz finden Sie hier.

4. Autoboxing und Unboxing

Im vorherigen Abschnitt haben wir gezeigt, wie ein primitiver Wert manuell in ein Objekt konvertiert wird.

Nach Java 5 kann diese Konvertierung automatisch mithilfe der Funktionen Autoboxing und Unboxing durchgeführt werden.

"Boxen" bezieht sich auf das Konvertieren eines primitiven Werts in ein entsprechendes Wrapper-Objekt. Da dies automatisch geschehen kann, wird dies als Autoboxing bezeichnet.

In ähnlicher Weise , wenn ein Wrapper - Objekt in einen Grundwert ausgepackt wird , dann wird dies als Unboxing bekannt.

In der Praxis bedeutet dies, dass wir einen primitiven Wert an eine Methode übergeben können, die ein Wrapper-Objekt erwartetoder weisen Sie einer Variablen, die ein Objekt erwartet, ein Grundelement zu:

List list = new ArrayList(); list.add(1); // autoboxing Integer val = 2; // autoboxing

In diesem Beispiel konvertiert Java den primitiven int- Wert automatisch in den Wrapper.

Intern wird die valueOf () -Methode verwendet, um die Konvertierung zu erleichtern. Die folgenden Zeilen sind beispielsweise äquivalent:

Integer value = 3; Integer value = Integer.valueOf(3);

Obwohl dies die Konvertierung erleichtert und Codes besser lesbar macht, gibt es einige Fälle, in denen wir kein Autoboxing verwenden sollten, z . B. innerhalb einer Schleife .

Ähnlich wie beim Autoboxing erfolgt das Entpacken automatisch, wenn ein Objekt an eine Methode übergeben wird, die ein Grundelement erwartet, oder wenn es einer Grundvariablen zugewiesen wird:

Integer object = new Integer(1); int val1 = getSquareValue(object); //unboxing int val2 = object; //unboxing public static int getSquareValue(int i) { return i*i; }

Im Grunde genommen , wenn wir eine Methode schreiben , die einen Grundwert oder Wrapper - Objekt übernimmt, können wir noch beide Werte an sie weitergeben. Java sorgt dafür, dass je nach Kontext der richtige Typ übergeben wird, z. B. Primitiv oder Wrapper.

5. Schlussfolgerung

In diesem kurzen Tutorial haben wir über Wrapper-Klassen in Java sowie über den Mechanismus des Autoboxing und Unboxing gesprochen.