Das Problem der automatischen Packungs- und Unboxing -Probleme ist ein häufiges Problem in Java. Heute werden wir uns einige der Probleme beim Verpacken und Unboxen ansehen. In diesem Artikel geht es zuerst über die grundlegendsten Dinge über das Packen und Unboxen aus und schaute dann die Probleme im Zusammenhang mit Packen und Unboxen, die im folgenden schriftlichen Test häufig auftreten.
1. Was ist Packung? Was ist Unboxing?
Im vorherigen Artikel bietet Java entsprechende Wrapper -Typen für jeden Basistyp. Wenn die Wrapper -Typen für jeden grundlegenden Datentyp bereitgestellt werden, wird dies hier nicht erläutert. Interessierte Freunde können die relevanten Informationen konsultieren. Wenn Sie vor Java SE5 ein ganzzahliges Objekt mit einem Wert von 10 generieren möchten, müssen Sie dies tun:
Die Codekopie lautet wie folgt:
Ganzzahl i = New Integer (10);
Seit Java SE5 wird die automatische Boxfunktion bereitgestellt. Wenn Sie ein ganzzahliges Objekt mit einem Wert von 10 generieren möchten, müssen Sie dies nur tun:
Die Codekopie lautet wie folgt:
Ganzzahl i = 10;
In diesem Prozess wird das entsprechende Integer -Objekt automatisch basierend auf dem packenden numerischen Wert erstellt.
Was ist das Unboxing? Wie der Name schon sagt, entspricht es der Packung, die den Wrapper -Typ automatisch in den Basistyp umwandelt:
Die Codekopie lautet wie folgt:
Ganzzahl i = 10; //Verpackung
int n = i; // Unbox
Um es einfach auszudrücken, bedeutet das Packen automatisch den grundlegenden Datentyp in den Wrapper -Typ. Unboxing bedeutet, den Wrapper -Typ automatisch in den Basistyp zu konvertieren.
Die folgende Tabelle ist der Wrapper -Typ, der dem Basistyp entspricht:
2. Wie wird Packung und Unboxing implementiert?
Nach dem Verständnis der grundlegenden Verpackungskonzepte im vorherigen Abschnitt versteht dieser Abschnitt, wie das Verpacken und Unboxing implementiert werden.
Nehmen wir die Interger -Klasse als Beispiel an und sehen Sie unten einen Code -Stück:
public class main {public static void main (String [] args) {Integer i = 10; int n = i;}}Nachdem Sie die Klassendatei enthärtet haben, erhalten Sie den folgenden Inhalt:
Aus dem Bytecode -Inhalt, der durch Dekompeten erhalten wird, ist ersichtlich, dass die ValueOF (Int) -Methode der Ganzzahl beim Packen automatisch aufgerufen wird. Beim Unboxen wird die IntValue -Methode der Ganzzahl automatisch aufgerufen.
Andere sind ähnlich, wie doppelt oder charakter. Freunde, die nicht daran glauben, können es manuell von sich selbst versuchen.
Daher kann der Implementierungsprozess für Packung und Unboxing in einem Satz zusammengefasst werden:
Der Boxprozess wird implementiert, indem die ValueOF -Methode des Wrappers aufgerufen wird, während der Unboxing -Prozess durch Aufrufen der xxxValue -Methode des Wrappers implementiert wird. (XXX repräsentiert den entsprechenden Grunddatentyp).
3.. Verwandte Fragen während des Interviews
Obwohl sich die meisten Menschen über die Konzepte des Verpackens und Unboxens klar machen, können sie möglicherweise nicht in der Lage sein, Fragen zum Packen und Unboxen in Interviews und schriftlichen Tests zu beantworten. Im Folgenden finden Sie einige gängige Interviewfragen im Zusammenhang mit Packung/Unboxing.
1. Was ist das Ausgabeergebnis des folgenden Code?
public class main {public static void main (String [] args) {Integer i1 = 100; Integer i2 = 100; Integer i3 = 200; Integer i4 = 200; System.out.println (i1 == i2); Vielleicht sagen einige Freunde, dass sie falsche ausgeben, oder einige Freunde werden sagen, dass sie wahr ausgeben. Aber in der Tat ist die Ausgabe:
WAHR
FALSCH
Warum tritt ein solches Ergebnis auf? Die Ausgabeergebnisse zeigen, dass I1 und I2 auf dasselbe Objekt verweisen, während I3 und I4 auf verschiedene Objekte hinweisen. Zu diesem Zeitpunkt müssen Sie nur den Quellcode betrachten, um die Wahrheit zu kennen. Der folgende Code ist die spezifische Implementierung der ValueOF -Methode von Integer:
public static Integer ValueOf (int i) {if (i> = -128 && i <= integercache.high) return IntegerCache.cache [i + 128]; ElserTurn New Integer (i);} Die Implementierung der IntegerCache -Klasse lautet:
private statische Klasse IntegerCache {statische endgültige int hohe; Long.decode (IntegerCacheHighPropValue) .IntValue (); i = math.max (i, 127); // Maximale Arraygröße ist ganzzahl. k <cache.length; Aus diesen beiden Codeteilen wird beim Erstellen eines Integer-Objekts über die ValueOF-Methode, wenn der Wert zwischen [-128, 127] liegt, ein Verweis auf das Objekt, das bereits in IntegerCache vorliegt. Cache wird zurückgegeben. Andernfalls wird ein neues ganzzahliges Objekt erstellt.
Im obigen Code sind die Werte von I1 und I2 100, sodass die vorhandenen Objekte direkt aus dem Cache genommen werden, sodass I1 und I2 auf dasselbe Objekt verweisen, während I3 und I4 auf verschiedene Objekte hinweisen.
2. Was ist das Ausgabeergebnis des folgenden Code?
public class main {public static void main (String [] args) {double i1 = 100.0; doppel i2 = 100,0; double i3 = 200.0; double i4 = 200.0; System.out.println (i1 == i2); Vielleicht werden einige Freunde denken, dass das Ausgabeergebnis die gleiche ist wie die obige Frage, aber tatsächlich nicht. Die tatsächliche Ausgabe ist:
FALSCH
FALSCH
Wie aus dem spezifischen Grund können die Leser die Implementierung des Wertes der Doppelklasse überprüfen.
Hier werde ich nur erklären, warum die ValueOF -Methode der Doppelklasse eine andere Implementierung annimmt als die ValueOF -Methode der Ganzzahlklasse. Es ist sehr einfach: Die Anzahl der Ganzzahlwerte in einem bestimmten Bereich ist endlich, aber schwimmende Punktzahlen sind nicht.
Beachten Sie, dass die Implementierung von Wertschöpfungsmethoden von Ganzzahl, Short, Byte, Charakter und lang ähnlich ist.
Die Implementierung der ValueOF -Methode von Doppel und Float ist ähnlich.
3. Was ist das Ausgabeergebnis des folgenden Code:
public class main {public static void main (String [] args) {boolean i1 = false; boolean i2 = false; boolean i3 = true; boolean i4 = true; System.out.println (i1 == i2); Das Ausgangsergebnis ist:
WAHR
WAHR
Wenn dies das Ergebnis ist, werden Sie nach dem Lesen des Quellcode der Booleschen Klasse auch auf einen Blick klar sein. Das Folgende ist die spezifische Implementierung der Wertmethode von Boolean:
public static boolean valueof (boolean b) {return (b? true: false);} Und was ist wahr und falsch? 2 statische Mitgliedereigenschaften sind in boolean definiert:
public static final boolean true = new boolean (true);/** * Das boolesche <coolean </code> Objekt, das dem primitiven * value <code> false </code> entspricht. */Public Static Final Boolean False = New Boolean (Falsch);
An diesem Punkt sollte jeder verstehen, warum die obige Ausgabe wahr ist.
4. Sprechen Sie über den Unterschied zwischen Integer i = New Integer (xxx) und Ganzzahl i = xxx;
Natürlich gehört dieses Thema zu einem relativ breiten Typ. Aber die wichtigsten Punkte müssen beantwortet werden. Lassen Sie mich die folgenden zwei Unterschiede zusammenfassen:
1) Die erste Methode löst den automatischen Boxprozess nicht aus. während die zweite Methode auslöst;
2) Der Unterschied in der Ausführungseffizienz und der Ressourcennutzung. Die zweite Methode zur Ausführungseffizienz und der Ressourcennutzung ist besser als die erste im Allgemeinen (beachten Sie, dass dies nicht absolut ist).
5. Was ist das Ausgabeergebnis des folgenden Programms?
public class main {public static void main (String [] args) {Integer a = 1; Integer b = 2; Ganzzahl c = 3; Ganzzahl d = 3; Ganzzahl e = 321; Ganzzahl f = 321; lang g = 3L; lang H = 2l; system.out.println (c == d); System.out.println (e == f); System.out.println (c == (a+b)); Betrachten Sie nicht zuerst die Ausgabeergebnisse, die Leser werden sich selbst über die Ausgabeergebnisse dieses Codes nachdenken. Dies sollte hier beachtet werden, dass, wenn die beiden Operanden des Operators "==" Verweise auf den Wrapper -Typ sind, vergleicht, ob der Zeiger das gleiche Objekt ist. Wenn einer der Operanden ein Ausdruck ist (dh enthält arithmetische Operationen), vergleicht es die numerischen Werte (die den automatischen Aufpackungsprozess auslösen). Darüber hinaus führt die Equals -Methode für Wrapper -Typen keine Typumwandlung durch. Nach dem Verständnis dieser 2 Punkte sind die obigen Ausgabeergebnisse auf einen Blick klar:
WAHR
FALSCH
WAHR
WAHR
WAHR
FALSCH
WAHR
Es besteht kein Zweifel an den ersten und zweiten Ausgabeergebnissen. Da A+B im dritten Satz arithmetische Operationen enthält, löst es den automatischen Unboxing -Prozess aus (die intvalue -Methode wird aufgerufen), sodass sie vergleichen, ob die Werte gleich sind. Für C.Equals (A+B) wird zuerst der automatische Unboxing -Prozess ausgelöst und dann der automatische Packungsprozess ausgelöst. Das heißt, A+B nennt jeweils die intvalue -Methode, und nach dem Erhalt des Werts nach dem Additionsvorgang wird die Ganzzahl -Wert -Methode aufgerufen, und dann wird der Equals -Vergleich durchgeführt. Gleiches gilt für Folgendes, aber achten Sie auf die Ergebnisse der zweiten bis zuletzten und letzten Ausgabe (wenn der Wert vom Typ int ist, ruft der Boxprozess integer.
Das obige ist ein tiefes Verständnis für das Verpacken und Unboxen in Java, das Ihnen vom Herausgeber vorgestellt wurde. Ich hoffe, es wird Ihnen hilfreich sein. Wenn Sie Fragen haben, hinterlassen Sie mir bitte eine Nachricht und der Editor wird Ihnen rechtzeitig antworten. Vielen Dank für Ihre Unterstützung auf der Wulin.com -Website!