Heim >Java >javaLernprogramm >Element Bevorzugt primitive Typen gegenüber verpackten primitiven Typen

Element Bevorzugt primitive Typen gegenüber verpackten primitiven Typen

Patricia Arquette
Patricia ArquetteOriginal
2024-10-10 08:09:02548Durchsuche

Item  Dê preferência aos tipos primitivos em vez dos tipos primitivos empacotados

Primitive Typen vs. Verpackte primitive Typen

  • Primitive Typen: int, double, boolean usw.
  • Gepackte primitive Typen: Ganzzahl, Doppelt, Boolesch usw.
  • Java verfügt über ein duales Typsystem: primitive Typen und Referenztypen (Objekte).
  • Jeder primitive Typ hat eine entsprechende Wrapper-Klasse.

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

  • 1. Vergleich von Identität statt Wert
  • Wenn Sie mit == gepackte Objekte vergleichen, vergleichen Sie Objektreferenzen, nicht die Werte. Dies kann zu unerwarteten Ergebnissen führen.

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?

  • Sammlungen: Sie können keine primitiven Typen in generischen Sammlungen (z. B. Liste) verwenden.
  • Generische Parameter: Generische Typen unterstützen keine primitiven Typen (z. B. ThreadLocal).
  • APIs, die Objekte erfordern: Bestimmte APIs erfordern Objekte anstelle von primitiven Typen.

Gute Praktiken

  • Primitive Typen bevorzugen: Verwenden Sie nach Möglichkeit primitive Typen aus Gründen der Einfachheit und Effizienz.
  • Seien Sie beim Autoboxing/Unboxing vorsichtig: Autoboxing reduziert die Ausführlichkeit, kann aber zu subtilen Fehlern führen.
  • Vermeiden Sie Vergleiche mit == in Wrapped: Verwenden Sie Methoden wie equal() oder vergleichen Sie die unverpackten Werte.
  • Auf Nullen prüfen: Beachten Sie beim Arbeiten mit gepackten Typen, dass diese null sein und eine NullPointerException verursachen können.

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn