JavaRush /Java-Blog /Random-DE /Ein-, Auspacken und Verpacken

Ein-, Auspacken und Verpacken

Veröffentlicht in der Gruppe Random-DE
Hallo! Sie sind mit primitiven Typen bereits recht vertraut und haben viel mit ihnen gearbeitet. Ein-, Auspacken und Verpacken – 1Primitive haben in der Programmierung und insbesondere in Java viele Vorteile: Sie beanspruchen wenig Speicher, erhöhen dadurch die Effizienz des Programms und sind übersichtlich in Wertebereiche unterteilt. Beim Erlernen von Java haben wir jedoch wie ein Mantra mehr als einmal wiederholt: „ In Java ist alles ein Objekt .“ Aber Primitive sind eine direkte Widerlegung dieser Worte. Sie sind keine Objekte. Der Grundsatz „Alles ist ein Objekt“ ist also falsch? Nicht wirklich. In Java hat jeder primitive Typ seinen Zwillingsbruder, die Wrapper-Klasse ( Wrapper). Was ist ein Wrapper? Ein Wrapper ist eine spezielle Klasse, die den Wert eines Grundelements in sich selbst speichert. Da es sich jedoch um eine Klasse handelt, kann sie eigene Instanzen erstellen. Sie speichern die notwendigen Grundwerte im Inneren, während sie echte Objekte sind. Die Namen der Wrapper-Klassen sind den Namen der entsprechenden Grundelemente sehr ähnlich oder stimmen vollständig mit ihnen überein. Daher wird es sehr einfach sein, sich an sie zu erinnern.
Wrapper-Klassen für primitive Datentypen
Primitive Datentypen Wrapper-Klassen
int Ganze Zahl
kurz Kurz
lang Lang
Byte Byte
schweben Schweben
doppelt Doppelt
verkohlen Charakter
Boolescher Wert Boolescher Wert
Wrapper-Klassenobjekte werden wie alle anderen erstellt:
public static void main(String[] args) {

   Integer i = new Integer(682);

   Double d = new Double(2.33);

   Boolean b = new Boolean(false);
}
Mit Wrapper-Klassen können Sie die Nachteile primitiver Typen abmildern. Das offensichtlichste ist, dass Grundelemente keine Methoden haben . Sie verfügen beispielsweise nicht über eine Methode toString(), sodass Sie beispielsweise keine Zahl intin eine Zeichenfolge umwandeln können. Aber mit einer Wrapper-Klasse Integerist es einfach.
public static void main(String[] args) {

   Integer i = new Integer(432);

   String s = i.toString();
}
Auch bei der Rücktransformation wird es Schwierigkeiten geben. Nehmen wir an, wir haben eine Zeichenfolge, von der wir sicher wissen, dass sie eine Zahl enthält. Bei einem primitiven Typ intist es uns jedoch nicht möglich, diese Zahl aus der Zeichenfolge abzurufen und sie tatsächlich in eine Zahl umzuwandeln. Aber dank Wrapper-Klassen haben wir jetzt diese Möglichkeit.
public static void main(String[] args) {

   String s = "1166628";

   Integer i = Integer.parseInt(s);

   System.out.println(i);
}
Ausgabe: 1166628 Wir haben erfolgreich eine Zahl aus einer Zeichenfolge abgerufen und sie einer Referenzvariablen zugewiesen Integer i. Übrigens zu den Links. Sie wissen bereits, dass Parameter auf unterschiedliche Weise an Methoden übergeben werden: Grundelemente werden als Wert und Objekte als Referenz übergeben. Dieses Wissen können Sie bei der Erstellung Ihrer Methoden nutzen: Wenn Ihre Methode beispielsweise mit Bruchzahlen arbeitet, Sie aber die Logik der Referenzübergabe benötigen, können Sie Double/Floatstatt . Parameter an die Methode übergeben double/float. Darüber hinaus verfügen Wrapper-Klassen zusätzlich zu Methoden über statische Felder, die sehr praktisch sind. Stellen Sie sich zum Beispiel vor, dass Sie jetzt vor einer Aufgabe stehen: Geben Sie die maximal mögliche Anzahl an die Konsole aus intund dann die minimal mögliche Anzahl. Die Aufgabe scheint einfach zu sein, aber ohne Google wird man sie kaum schaffen. Und mit Wrapper-Klassen können Sie ganz einfach die folgenden „Alltagsprobleme“ lösen:
public class Main {
   public static void main(String[] args) {

       System.out.println(Integer.MAX_VALUE);
       System.out.println(Integer.MIN_VALUE);
   }
}
Solche Felder ermöglichen es Ihnen, nicht von ernsteren Aufgaben abgelenkt zu werden. Ganz zu schweigen von der Tatsache, dass es beim Drucken der Zahl 2147483647 (das ist genau MAX_VALUE) nicht verwunderlich ist, dass man sich vertippt :) Darüber hinaus haben wir in einer der vorherigen Vorlesungen bereits darauf aufmerksam gemacht, dass Objekte von Wrapper-Klassen sind unveränderlich (unveränderlich) .
public static void main(String[] args) {

   Integer a = new Integer(0);
   Integer b = new Integer(0);

   b = a;
   a = 1;
   System.out.println(b);
}
Ausgabe: 0 Das Objekt, auf das die Referenz ursprünglich zeigte, аhat seinen Zustand nicht geändert, sonst bhätte sich auch der Wert geändert. Anstatt Stringden Status des Wrapper-Objekts zu ändern, wird wie bei ein völlig neues Objekt im Speicher erstellt. Warum haben sich die Entwickler von Java letztendlich dafür entschieden, primitive Typen in der Sprache beizubehalten? Da alles ein Objekt sein sollte und wir bereits Wrapper-Klassen haben, mit denen alles ausgedrückt werden kann, was Grundelemente ausdrücken, warum lassen wir sie nicht einfach in der Sprache und entfernen die Grundelemente? Die Antwort ist einfach: Leistung. Primitive Typen werden als primitiv bezeichnet, weil ihnen viele „schwere“ Objektmerkmale fehlen. Ja, ein Objekt verfügt über viele praktische Methoden, aber Sie benötigen sie nicht immer. Manchmal benötigen Sie einfach die Zahl 33 oder 2,62 oder den Wert true/ false. In Situationen, in denen alle Vorteile von Objekten irrelevant sind und für die Funktion des Programms nicht benötigt werden, leisten Primitiven einen viel besseren Job.

Automatisches Ein- und Auspacken

Eines der Merkmale von Primitiven und ihren Wrapper-Klassen in Java ist Autoboxing/Autounboxing. Ein-, Auspacken und Verpacken – 2 Lassen Sie uns dieses Konzept verstehen. Wie Sie und ich bereits zuvor erfahren haben, ist Java eine objektorientierte Sprache. Das bedeutet, dass alle in Java geschriebenen Programme aus Objekten bestehen. Primitive sind keine Objekte. Der Wrapper-Klassenvariablen kann jedoch ein Wert eines primitiven Typs zugewiesen werden. Dieser Vorgang wird Autoboxing genannt . Auf die gleiche Weise kann einer Variablen eines primitiven Typs ein Objekt einer Wrapper-Klasse zugewiesen werden. Dieser Vorgang wird Autounboxing genannt . Zum Beispiel:
public class Main {
   public static void main(String[] args) {
       int x = 7;
       Integer y = 111;
       x = y; // automatisches Entpacken
       y = x * 123; // Autopacking
   }
}
In Zeile 5 weisen wir dem Grundelement x den Wert von y zu, das ein Objekt der Wrapper-Klasse ist Integer. Wie Sie sehen, sind hierfür keine weiteren Aktionen erforderlich: Der Compiler weiß das intund Integertatsächlich dasselbe . Das ist automatisches Entpacken. Das Gleiche passiert beim Autoboxing in Zeile 6: Dem Objekt y wird ganz einfach der Wert von Primitiven (x*123) zugewiesen. Dies ist ein Beispiel für Autopacking. Aus diesem Grund wird das Wort „auto“ hinzugefügt: Um Objekten ihrer Wrapper-Klassen primitive Referenzen zuzuweisen (und umgekehrt), müssen Sie nichts tun, alles geschieht automatisch . Praktisch, oder? :) Ein weiterer sehr großer Komfort des automatischen Packens/Auto-Entpackens zeigt sich in der Funktionsweise der Methoden. Tatsache ist, dass Methodenparameter auch dem automatischen Packen und Entpacken unterliegen . Und wenn einer von ihnen beispielsweise zwei Objekte als Eingabe verwendet Integer, können wir dort problemlos gewöhnliche Grundelemente übergeben int!
public class Main {
   public static void main(String[] args) {

       printNumber(7);//reguläres int, auch ohne Variable
   }

   public static void printNumber(Integer i) {
       System.out.println(„Sie haben eine Nummer eingegeben“ + i);
   }
}
Ausgabe: Sie haben die Zahl 7 eingegeben. Es funktioniert umgekehrt:
public class Main {
   public static void main(String[] args) {

       printNumber(new Integer(632));
   }

   public static void printNumber(int i) {
       System.out.println(„Sie haben eine Nummer eingegeben“ + i);
   }
}
Ein wichtiger Punkt, den Sie beachten sollten: Autoboxing und Unboxing funktionieren nicht für Arrays !
public class Main {
   public static void main(String[] args) {

       int[] i = {1,2,3,4,5};

       printArray(i);//Fehler, wird nicht kompiliert!
   }

   public static void printArray(Integer[] arr) {
       System.out.println(Arrays.toString(arr));
   }
}
Der Versuch, ein Array von Grundelementen an eine Methode zu übergeben, die ein Array von Objekten als Eingabe verwendet, führt zu einem Kompilierungsfehler. Lassen Sie uns abschließend noch einmal kurz die Primitiven und Wrapper- Primitive vergleichen:
  • einen Leistungsvorteil haben
Wrapper:
  • Sie ermöglichen es Ihnen, den Grundsatz „Alles ist ein Objekt“ nicht zu verletzen, sodass Zahlen, Symbole und boolesche Werte wahr/falsch nicht aus diesem Konzept fallen
  • Erweitern Sie die Möglichkeit, mit diesen Werten zu arbeiten, indem Sie praktische Methoden und Felder bereitstellen
  • Erforderlich, wenn eine Methode ausschließlich mit Objekten arbeiten kann
Kommentare
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION