Primitive Typen vs. Verpackte primitive Typen
Hauptunterschiede
Identität vs. Wert:
Primitive: Sie haben keine Identität; Zwei Grundelemente mit demselben Wert sind immer gleich.
Verpackt: Sie sind Objekte und haben Identität; Zwei Objekte können den gleichen Wert, aber unterschiedliche Identitäten haben.
Nullwerte:
Primitive: Haben immer einen Standardwert (z. B. 0 für int).
Verpackt: Kann null sein, was bei unsachgemäßer Behandlung zu NullPointerException-Ausnahmen führen kann.
Leistung:
Primitive: Zeit- und räumlich effizienter.
Paketiert:Führt zu Mehraufwand aufgrund der Erstellung zusätzlicher Objekte.
Häufige Probleme beim Mischen von Grundelementen und Paketen
Problematisches Beispiel:
Comparator<Integer> naturalOrder = (i, j) -> (i < j) ? -1 : (i == j ? 0 : 1);
Problem: Der i == j-Vergleich vergleicht Referenzen, keine Werte.
Falsches Verhalten: naturalOrder.compare(new Integer(42), new Integer(42)) gibt 1 statt 0 zurück.
Lösung:
Verwenden Sie die Methode „compareTo“ oder Hilfsmethoden der Klasse „Integer“.
Comparator<Integer> naturalOrder = Integer::compare;
Oder Korrektur des ursprünglichen Komparators:
Comparator<Integer> naturalOrder = (iBoxed, jBoxed) -> { int i = iBoxed; int j = jBoxed; return (i < j) ? -1 : ((i == j) ? 0 : 1); };
2. Autounboxing und NullPointerException
Wenn gepackte Typen verwendet werden, die null sein können, kann das automatische Unboxing Ausnahmen auslösen, wenn das Objekt null ist.
Problematisches Beispiel:
Integer i = null; if (i == 42) { System.out.println("Inacreditável"); }
Problem: i ist null; Beim Vergleich mit 42 tritt Null-Autounboxing auf, was zu einer NullPointerException führt.
Lösung:Verwenden Sie nach Möglichkeit primitive Typen.
int i = 0; if (i == 42) { System.out.println("Inacreditável"); }
3. Leistungseinbußen aufgrund von Autoboxing/Unboxing
Die versehentliche Verwendung verpackter Typen bei intensiven Vorgängen kann aufgrund von Autoboxing und unnötiger Objekterstellung zu Leistungseinbußen führen.
Problematisches Beispiel:
Long sum = 0L; for (long i = 0; i <= Integer.MAX_VALUE; i++) { sum += i; } System.out.println(sum);
Problem: sum ist ein gepacktes Long; In jeder Iteration findet Autoboxing/Unboxing statt.
Auswirkung: Viel langsamerer Code und übermäßige Speichernutzung.
Lösung:
Verwenden Sie primitive Typen für lokale Variablen in intensiven Operationen.
long sum = 0L; for (long i = 0; i <= Integer.MAX_VALUE; i++) { sum += i; } System.out.println(sum);
Wann sind verpackte Typen zu verwenden?
Gute Praktiken
Zusammenfassung
Primitive Typen:
Einfacher und schneller.
Sie dürfen nicht null sein.
Sie haben keine Identität (nur Wert).
Verpackte Typen:
Erforderlich für die Verwendung in Sammlungen und generischen APIs.
Sie können null sein.
Sie haben Objektidentität.
Das obige ist der detaillierte Inhalt vonElement Bevorzugt primitive Typen gegenüber verpackten primitiven Typen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!