1. Aus Leistungsgründen werden Arrays bevorzugt
Arrays werden in der Projektentwicklung immer seltener verwendet, insbesondere in der geschäftsorientierten Entwicklung. Erstens verfügen Arrays nicht über viele Methoden, die von Sammlungen wie List und Set bereitgestellt werden. Sie müssen die Such- und Additionsalgorithmen selbst schreiben Extrem umständlich und mühsam. Da Sammlungen wie List und Set generische Unterstützung verwenden, werden sie alle in Wrapper-Klassen gespeichert, und Arrays können grundlegende Datentypen verwenden. und die unterste Ebene der Sammlungsklasse Es wird auch über Arrays implementiert.
2. Verwenden Sie bei Bedarf Arrays variabler Länge
Beim Erlernen von Sammlungsklassen vergleichen viele Leute gerne die feste Länge des Arrays mit der variablen Länge des Sammlungstyps, aber tatsächlich ist dieser Vergleich nicht angemessen, wenn wir die Implementierung von Sammlungsklassen wie ArrayList beobachten Die sogenannte Sammlung wird länger. Tatsächlich erweitert sie das ursprüngliche Array nur auf taktvolle Weise.
Kopieren Sie den Codecode wie folgt:
public static T[] expandCapacity(T[] data, int newLength) {
// Bestimmen Sie, ob es sich um einen negativen Wert handelt
newLength = newLength < 0 ? 0 : newLength;
// Ein neues Array generieren, den Originalwert kopieren und die Länge angeben
return Arrays.copyOf(data, newLength);
}
Bei hohen Leistungsanforderungen können Sie über die Kapselung von Arrays nachdenken. Die konstante Länge des Arrays ist für uns kein Grund, sie nicht zu verwenden.
3. Seien Sie vorsichtig bei flachen Kopien von Arrays
Flache Kopie eines Arrays ist auch die Grundlage der Java-Programmierung. Beim Kopieren eines Arrays kopiert der Basistyp den Wert, während der Referenztyp die Referenzadresse kopiert. Im obigen Beispiel wird das Array mithilfe von Arrays.copyOf kopiert Da es sich um eine flache Kopie handelt, müssen Sie bei der Verwendung vorsichtig sein.
4. Geben Sie unter klaren Szenarien die anfängliche Kapazität für die Sammlung an
Da sich in unserem täglichen Gebrauch die Länge des Sammlungstyps automatisch ändert, wird der Anfangswert beim Erstellen eines Objekts nicht an die Sammlungsklasse angehängt. Nehmen wir als Beispiel unsere am häufigsten verwendete ArrayList Die Kapazität ist erreicht. Am kritischen Punkt wird das zugrunde liegende Array erreicht Die Operation copyOf generiert ein neues Array. Die Kapazität des neuen Arrays beträgt das 1,5-fache der Kapazität des alten Arrays und die Standardlänge des Arrays beträgt 10. Wenn wir klar wissen, dass die im Container abzulegende Datenmenge groß ist, Wir sollten den Anfangswert angeben, um übermäßigen Leistungsaufwand durch die Verwendung von copyOf-Zeiten zu vermeiden
5. Wählen Sie den geeigneten optimalen Algorithmus
Die Suche nach dem maximalen oder minimalen Wert von Daten ist das grundlegendste Wissen über die Datenstruktur. Wir haben auch viele Möglichkeiten, es in Java zu implementieren. Hier sind zwei Algorithmen.
Kopieren Sie den Codecode wie folgt:
public static int getMaxByArray(int[] data) {
//Die einfachste selbstimplementierte Suchmethode
int max = data[0];
for (int i = 1, size = data.length; i < size; i++) {
max = max < i ? i : max;
}
Rückkehr max;
}
Kopieren Sie den Codecode wie folgt:
public static int getMaxByArray(int[] data) {
// Zuerst sortieren und dann das letzte Bit abrufen
Arrays.sort(data);
return data[data.length - 1];
}
6. Grundlegende Array-Konvertierungsfalle!
Bitte beachten Sie den folgenden Code
Kopieren Sie den Codecode wie folgt:
public static void main(String[] args) {
int[] nums = new int[] { 1, 2, 3, 4, 5 };
Liste list = Arrays.asList(nums);
System.out.println(list.size());
//Die Ausgabegröße beträgt zu diesem Zeitpunkt 1
}
Das von uns erwartete Ergebnis bestand darin, die Elemente im Array über Arrays.asList in eine Sammlungsklasse umzuwandeln. Entgegen den Erwartungen haben wir jedoch nur das Array selbst hinzugefügt und die Werte im Array zu diesem Zeitpunkt nicht getrennt. Wenn die Sammlung generische Elemente zur Liste hinzufügt, wird während der Kompilierung eine Fehlermeldung angezeigt, oder das Ändern des Arrays selbst in „Integer“ kann das Problem lösen.
7. Das von der asList-Methode generierte List-Objekt kann nicht geändert werden.
Anhand des obigen Beispiels können wir sehen, dass die Verwendung der Arrays.asList-Methode ein Array in eine Liste konvertieren kann. Was ist also das Besondere an der von der asList-Methode zurückgegebenen Liste? Beachten Sie, dass die zurückgegebene Liste keine Änderungen unterstützt, da die asList-Methode zurückgegeben wird nicht java.util.ArrayList, sondern Array Eine statische private interne Klasse in der s-Tool-Klasse, obwohl sie die gleiche übergeordnete Klasse AbstractList wie ArrayList hat, aber beim Überschreiben von add und anderen Methoden wird eine UnsupportedOperationException ausgelöst. Diese statische private interne Klasse implementiert nur size, toArray, Get, enthält diese Methoden
8. Verwenden Sie unterschiedliche Traversierungsmethoden für unterschiedliche Datenstrukturen
Bitte beachten Sie den folgenden Code
Kopieren Sie den Codecode wie folgt:
public static void main(String[] args) {
// Das Folgende ist die Durchlaufmethode der ArrayList-Sammlung
int num = 80 * 10000;
Liste arrayList = new ArrayList(num);
for (int i = 0, size = arrayList.size(); i < size; i++) {
arrayList.get(i);
}
// Das Folgende ist die Traversal-Methode der LinkedList-Sammlung
Liste linkedList = new LinkedList();
for (Ganzzahlige Ganzzahl: verknüpfte Liste) {
}
}
Warum unterschiedliche Durchlaufmethoden für LinkedList und ArrayList wählen?
1. Da ArrayList die RamdomAccess-Schnittstelle (Direktzugriffsschnittstelle) implementiert, ist die RamdomAccess-Schnittstelle in Java dieselbe Markierungsschnittstelle wie die serialisierbare und klonbare Schnittstelle, was bedeutet, dass auf diese Klasse zufällig zugegriffen werden kann. Für ArrayList bedeutet dies, dass es Daten gibt Keine Korrelation, das heißt, zwei benachbarte Positionen haben keine gegenseitige Abhängigkeitsbeziehung und können zufällig aufgerufen werden.
2. Die foreach-Syntax in Java ist eine Variante der Verwendung von Iterator (Iterator). Wir wissen, dass Iterator eines der 23 Entwurfsmuster ist, aber der Iterator muss die Zeitbeziehung zwischen zwei Elementen kennen, andernfalls wie stellt er hasNext-Unterstützung bereit? Dies liegt daran, dass das vorherige Element feststellen muss, ob das nächste Element vorhanden ist, und diese Beziehung zwangsweise hergestellt wird, was die besonderen Eigenschaften des ArrayList-Direktzugriffs verletzt.
3. In LinkedList ist die Unterstützung für Iteratoren sehr gut, da es in Form einer doppelt verknüpften Liste gespeichert ist. Da in LinkedList eine inhärente Beziehung zwischen zwei benachbarten Elementen besteht, müssen für LinkedList und ArrayList unterschiedliche Durchlaufmethoden übernommen werden. Interessierte Leser können versuchen, in Form von Indizes auf LinkedList zuzugreifen, und werden feststellen, dass zwischen beiden eine große Effizienzlücke besteht.
8. Wählen Sie gegebenenfalls ArrayList oder LinkedList
Die Hauptunterschiede zwischen ArrayList und LinkedList:
1. Die zugrunde liegende Datenstruktur von ArrayList ist ein Array, während die zugrunde liegende Struktur von LinkedList eine doppelt verknüpfte Liste ist.
2. Da ArrayList beim Einfügen von Daten die Array-Elemente nach jedem Einfügen nach hinten verschieben muss, muss LinkedList nur den Kopfknoten und den Endknoten ändern, um den Einfügevorgang abzuschließen. Wenn also Einfügevorgänge häufiger vorkommen, wird LinkedList bevorzugt.
3. Da ArrayList beim Löschen von Daten die Reihenfolge des Arrays beibehalten muss, müssen die Elemente nach dem Löschen auch nach hinten oder vorne verschoben werden, während LinkedList weiterhin die Kopf- und Endknoten ändert.
4. Da LinkedList beim Aktualisieren eine Halbdurchlaufmethode verwendet, um das positionierte Element zu finden und es dann zu aktualisieren, ist ArrayList im Vergleich zum direkten Ersetzen positionierter Indexelemente durch ArrayList effizienter bei der Aktualisierung.
5.LinkedList kann eine Warteschlange durch Operationen wie addFirst und addLast von LinkedList simulieren.
9. Wenn Listen gleich sind, müssen Sie sich nur um die Elementdaten kümmern
Damit wir beruhigt Schnittstellen wie List, Set und Map programmieren können, hat Java Equlas in der Sammlungsklasse überschrieben, sodass wir beim Vergleich, ob zwei Sammlungen gleich sind, nur vergleichen müssen, ob die Elementdaten gleich sind Dadurch wird der fehlerhafte Java-Code behoben, der durch das Ersetzen der Sammlungsimplementierungsklasse verursacht wurde
Kopieren Sie den Codecode wie folgt:
public static void main(String[] args) {
Liste arrayList = new ArrayList();
arrayList.add(1);
arrayList.add(2);
Liste linkedList = new LinkedList();
linkedList.add(1);
linkedList.add(2);
System.out.println(arrayList.equals(linkedList));
// Die spezifische Implementierung ist egal, die Ausgabe ist wahr
}