[Interview mit Experten] – Java Collection (23 Fragen)

1.Was sind die gängigen Sammlungen in Java?

  • Sammlung
    • Liste: Unterstützt geordnete und wiederholbare Elemente, ArrayList, LinkedList und Vector.
    • Set: Ungeordnete, wiederholte Elemente sind nicht zulässig. Zu den häufig verwendeten Implementierungsklassen gehören HashSet, LinkedHashSet und TreeSet.
    • Warteschlange: Warteschlange
    • Deque: doppelendige Warteschlange
  • Karte
    • HashMap
    • LinkedHashMap
    • HashTable: ähnlich wie HashMap, aber threadsicher, nicht empfohlen, Sie können stattdessen ConcurrentHashMap verwenden.

2. Sagen Sie mir, was Sie über Java-Sammlungen verstehen?

Java-Sammlungen sind eine Reihe von Klassen und Schnittstellen, die zum Speichern und Bearbeiten von Daten verwendet werden. Sie sind ein sehr wichtiger Bestandteil der Java-Programmierung und werden zum Verwalten und Organisieren von Daten verwendet. Sie stellen verschiedene Datenstrukturen und Algorithmen bereit, um unterschiedliche Arten von Datenspeicherungs- und -abrufanforderungen zu erfüllen. Das Folgende ist mein Verständnis von Java-Sammlungen:

  • Datenspeicherung und -organisation: Java-Sammlungen werden zum Speichern und Organisieren von Daten verwendet und können verschiedene Datentypen speichern, einschließlich grundlegender Datentypen und Objekte. Sie bieten verschiedene Datenstrukturen wie Liste, Satz, Karte usw., um unterschiedliche Anforderungen an die Datenorganisation zu erfüllen.

  • Dynamische Größe: Java-Sammlungen verfügen häufig über dynamische Größen, die sich je nach Bedarf automatisch vergrößern oder verkleinern. Dadurch sind sie sehr flexibel und können sich an unterschiedliche Datenmengen anpassen.

  • Typsicherheit: Java-Sammlungen sind typsicher, was bedeutet, dass sie Datentypen zur Kompilierzeit überprüfen können, wodurch Laufzeitfehler reduziert werden.

  • Hohe Leistung: Java-Sammlungsklassen sind optimiert, um leistungsstarke Datenzugriffs- und Manipulationsmethoden bereitzustellen, um die Effizienz bei großen Datensätzen sicherzustellen.

  • Iteration und Traversierung: Java-Sammlungen bieten praktische Iterations- und Traversierungsmechanismen für den einfachen Zugriff auf die Elemente in der Sammlung.

  • Multithreading-Unterstützung: Java-Sammlungen umfassen threadsichere Implementierungen wie ConcurrentHashMap, um den gleichzeitigen Zugriff in Multithread-Umgebungen zu unterstützen.

  • Umfangreiche Funktionen: Java-Sammlungen bieten eine Fülle von Funktionen, einschließlich Sortierung, Suche, Filterung, Zuordnung und anderen Vorgängen, um verschiedene Datenverarbeitungsanforderungen zu erfüllen.

  • Gängige Sammlungsklassen: Zu den gebräuchlichen Sammlungsklassen in Java gehören ArrayList, LinkedList, HashSet, TreeSet, HashMap, TreeMap usw. Jede Sammlungsklasse hat ihre einzigartigen Eigenschaften und anwendbaren Szenarien.

Generische Unterstützung: Das Java-Collection-Framework verwendet Generics, um die Typsicherheit zu verbessern, sodass Sie den Typ der in der Sammlung gespeicherten Elemente zur Kompilierungszeit angeben können.

3. Könnten Sie mir bitte die Eigenschaften von List, Set und Map erklären?

  • Aufführen:
    • Ordnung: Liste ist eine geordnete Sammlung, die Elemente in der Reihenfolge verwaltet, in der sie eingefügt werden.
    • Wiederholbarkeit: Die Liste ermöglicht die Speicherung wiederholter Elemente, und dasselbe Element kann mehrmals vorkommen.
    • Auf Elemente zugreifen: Sie können auf Elemente in der Liste nach Index (Position) zugreifen und diese bedienen und dabei den Direktzugriff unterstützen.
    • Gängige Implementierungsklassen: ArrayList, LinkedList, Vector usw.
  • Satz:
    • Ungeordnet: Set ist eine ungeordnete Sammlung, die keine bestimmte Reihenfolge der Elemente beibehält.
    • Einzigartigkeit: Set erlaubt nicht das Speichern doppelter Elemente und jedes Element kann nur einmal in Set erscheinen.
    • Keine Unterstützung für die Indizierung: Set unterstützt den Zugriff auf Elemente über den Index nicht, da die Elemente keine bestimmte Position haben.
    • Gängige Implementierungsklassen: HashSet, LinkedHashSet, TreeSet usw.
  • Karte:
    • Schlüssel-Wert-Paare: Map ist eine Sammlung von Schlüssel-Wert-Paaren. Jedes Element enthält einen eindeutigen Schlüssel und den damit verbundenen Wert.
    • Eindeutigkeit der Schlüssel: Die Schlüssel in der Karte sind eindeutig und derselbe Schlüssel kann nicht mehreren Werten entsprechen.
    • Zugriff per Schlüssel: Auf Werte in einer Karte kann per Schlüssel statt über den Standort zugegriffen und sie manipuliert werden.
    • Gängige Implementierungsklassen: HashMap, LinkedHashMap, TreeMap, HashTable usw.

4. Wie kann man Sammlungen im eigentlichen Entwicklungsprozess besser auswählen?

  • Bedürfnisse verstehen: Klären Sie zunächst Ihre Bedürfnisse. Verstehen Sie die Art der Daten, die Sie speichern müssen, die Datenmenge, den Zugriffsmodus (mehr Lesen und weniger Schreiben, ausgewogenes Lesen und Schreiben, Multithread-Zugriff usw.) und die Betriebsanforderungen für die Daten (Suchen, Sortieren, Iteration usw.) sind der Schlüssel zur Auswahl einer Sammlung.

  • Ordnungsanforderungen:
    Wenn Sie die Reihenfolge der Elemente beibehalten müssen, können Sie Liste wählen.
    Wenn die Reihenfolge der Elemente keine Rolle spielt, können Sie Set oder Map wählen.

  • Anforderung an die Eindeutigkeit eines Elements:
    Wenn Sie die Eindeutigkeit eines Elements sicherstellen müssen, wählen Sie „Festlegen“.
    Wenn Sie eine Zuordnungsbeziehung vom Schlüssel zum Wert herstellen müssen, wählen Sie „Zuordnen“ aus.

  • Datenvolumen und Leistung:
    Für kleine Datenmengen und Szenarien, die keine hohe Leistung erfordern, können Sie in der Regel eine beliebige Sammlung wählen.
    Bei großen Datensätzen müssen Sie basierend auf den Leistungsanforderungen eine geeignete Datenstruktur auswählen, z. B. HashSet anstelle von ArrayList verwenden, um die Speicherung doppelter Daten zu vermeiden.
    Wenn Sie einen leistungsstarken gleichzeitigen Zugriff benötigen, können Sie die Verwendung gleichzeitiger Sammlungen (z. B. ConcurrentHashMap) in Betracht ziehen.

  • Betriebsanforderungen:
    Wenn Sie häufig Einfügungs- und Löschvorgänge durchführen müssen, sollten Sie die Verwendung einer LinkedList oder eines LinkedHashSet in Betracht ziehen, da diese Vorgänge effizienter sind.
    Wenn Sie schnellen Direktzugriff auf Elemente benötigen, verwenden Sie ArrayList oder HashMap.

  • Thread-Sicherheit:
    Wenn Sie in einer Multithread-Umgebung auf Sammlungen zugreifen, wählen Sie unbedingt eine Thread-sichere Sammlungsklasse oder erwägen Sie, den Vorgang zu sperren, um Race Conditions zu vermeiden.

  • Speicherbedarf:
    Berücksichtigen Sie den Speicherbedarf der Sammlung und wählen Sie geeignete Datenstrukturen aus, um die Speichernutzung zu minimieren.

  • Vergleichen Sie verschiedene Sammlungsimplementierungen:
    Java bietet eine Vielzahl von Sammlungsimplementierungen, z. B. ArrayList, LinkedList, HashSet, TreeSet, HashMap, TreeMap usw. Vergleichen Sie ihre Leistung und Funktionen sorgfältig, um die Implementierungsklasse auszuwählen, die Ihren Anforderungen am besten entspricht.
    Verwenden Sie generische Elemente: Versuchen Sie, generische Elemente zu verwenden, um die Art der in der Sammlung gespeicherten Elemente anzugeben, um die Typsicherheit zu erhöhen.

  • Erwägen Sie Bibliotheken von Drittanbietern: Manchmal verfügen Bibliotheken von Drittanbietern möglicherweise über Sammlungsimplementierungen, die bestimmten Anforderungen besser entsprechen, und Sie können die Verwendung dieser Bibliotheken in Betracht ziehen.

5. Was ist der Unterschied zwischen ArrayList und Vector?

  1. Erweiterungsmethode:
    1. ArrayList wird basierend auf der ursprünglichen Kapazität um das 0,5-fache erweitert.
    2. Vector wird basierend auf der ursprünglichen Kapazität um das 1-fache erweitert.
  2. Thread-Sicherheit:
    1. ArrayList ist Thread-unsicher;
    2. Vector ist Thread-sicher;
  3. Ausführungseffizienz:
    1. Die Methoden von Vector sind alle synchronisiert und müssen während der Methodenausführung gesperrt und entsperrt werden, sodass die Leistung geringer ist als bei ArrayList.

6. Was ist der Unterschied zwischen ArrayList und LinkedList?

  1. Die zugrunde liegende Datenstruktur: ArrayList verwendet unten ein Objektarray und LinkedList verwendet unten eine doppelt verknüpfte Liste (vor JDK1.6 war es eine zirkulär verknüpfte Liste, und JDK1.7 hat den Zyklus abgebrochen);
  2. Einfügen und Löschen von Elementen: ArrayList verwendet Array-Speicher, und Elemente müssen beim Einfügen und Löschen verschoben werden, sodass die Leistung schlecht ist. LinkedList verwendet Speicher für verknüpfte Listen und die Leistung ist relativ hoch.
    • ArrayList ist langsamer als LinkedList, wenn Daten in die Mitte der Sammlung eingefügt werden
    • Wenn ArrayList erweitert wird, ist das Hinzufügen von Daten langsamer als bei LinkedList.
    • ArrayList ist langsamer als LinkedList. Das Prinzip ist dasselbe wie das Einfügen von Daten in die Mitte der Sammlung. Jedes Mal, wenn Daten aus ArrayList gelöscht werden, muss das Array neu organisiert werden.
  3. Daten abfragen:
    • ArrayList ist schneller als LinkedList; ArrayList ist ein Array mit Indizes, die den Speicherort der Daten markieren. Bei der Abfrage kann die Welt die Daten in der folgenden Tabelle im entsprechenden Array zurückgeben.
  4. Datenspeicherung: Arrays erfordern einen kontinuierlichen Speicher, und verknüpfte Listen benötigen keinen kontinuierlichen Speicher.

7.Was ist der Unterschied zwischen HashSet und TreeSet?

  • Zugrundeliegende Datenstruktur: HashSet verwendet eine Hash-Tabelle als zugrunde liegende Datenstruktur, während TreeSet einen rot-schwarzen Baum als zugrunde liegende Datenstruktur verwendet.

  • Sortiermethode für Elemente: Die Elemente in HashSet sind ungeordnet, während die Elemente in TreeSet geordnet sind und standardmäßig gemäß der natürlichen Reihenfolge der Elemente sortiert sind. Wenn Sie auf andere Weise sortieren müssen, müssen Sie beim Erstellen des TreeSets ein Comparator-Objekt angeben.

  • Einzigartigkeit von Elementen: Die Elemente in einem HashSet sind einzigartig und erlauben keine Duplizierung, während die Elemente in einem TreeSet ebenfalls einzigartig sind, aber es bestimmt durch einen Komparator oder die natürliche Reihenfolge der Elemente, ob die Elemente gleich sind.

  • Leistung: Die zeitliche Komplexität der Einfüge-, Lösch- und Suchvorgänge von HashSet beträgt O(1), während die zeitliche Komplexität dieser Vorgänge von TreeSet O(log n) beträgt.

Wenn Sie also schnelle Einfüge-, Lösch- und Suchvorgänge benötigen und die Elemente nicht geordnet werden müssen, können Sie HashSet wählen. Wenn die Elemente geordnet oder auf andere Weise sortiert werden müssen, können Sie ein TreeSet auswählen.

8. Was ist der Unterschied zwischen HashMap und Hashtable?

  • Thread-Sicherheit:
    HashMap: HashMap ist nicht Thread-sicher. Mehrere Threads können gleichzeitig auf eine HashMap-Instanz zugreifen und diese ändern, was zu Parallelitätsproblemen führen kann und zusätzliche Synchronisierungsmaßnahmen erfordert, um die Thread-Sicherheit zu gewährleisten.
    Hashtable: Hashtable ist threadsicher. Seine Methoden sind synchronisiert, sodass mehrere Threads sicher auf eine Hashtable-Instanz zugreifen und diese ändern können. Diese Synchronisierung kann jedoch zu Leistungseinbußen führen. Daher wird HashMap empfohlen, wenn Thread-Sicherheit nicht erforderlich ist.
  • Nullschlüssel und -werte:
    HashMap: HashMap erlaubt Nullschlüssel und -werte.
    Hashtable: Hashtable erlaubt keine Nullschlüssel oder -werte. Wenn Sie versuchen, Null in eine Hashtabelle einzufügen, wird eine NullPointerException ausgelöst.
  • Durchlaufmethode:
    HashMap: HashMap garantiert nicht die Reihenfolge der Elemente, und die Durchlaufreihenfolge stimmt nicht unbedingt mit der Reihenfolge des Einfügens der Elemente überein.
    Hashtable: Hashtable garantiert nicht die Reihenfolge der Elemente, und die Reihenfolge des Durchlaufs stimmt nicht unbedingt mit der Reihenfolge des Einfügens der Elemente überein.
  • Vererbungsbeziehung:
    HashMap: HashMap erbt von der AbstractMap-Klasse und implementiert die Map-Schnittstelle.
    Hashtable: Hashtable erbt von der Dictionary-Klasse und implementiert die alte Version der Map-Schnittstelle. Die Verwendung in neuem Code wird nicht empfohlen.

9.Was ist ein Iterator? Was tut es?

Ein Iterator ist ein Objekt, das zum Durchlaufen der Elemente einer Sammlung verwendet wird. Er bietet eine einheitliche Möglichkeit, auf die Elemente in einer Sammlung zuzugreifen, ohne die interne Struktur der Sammlung zu kennen.

10. Wie erstelle ich eine unveränderliche Sammlung in Java?

Unveränderliche Sammlungen können mit den Collections.unmodifiableXXX-Methoden (z. B. unmodifiableList, unmodifiableSet) erstellt werden.

11.Wie durchquere ich eine Karte?

  • Verwenden Sie eine for-Schleife, um die Karte zu durchlaufen.
  • Verwenden Sie einen Iterator, um die Karte zu durchlaufen.
  • Verwenden Sie keySet, um die Karte zu durchlaufen.
  • Verwenden Sie EntrySet, um die Karte zu durchqueren.

12.Was ist CopyOnWriteArrayList?

13. Wie wählt man die Traversal-Methode von List aus?

14. Was ist der Erweiterungsmechanismus von ArrayList?

ArrayList ist ein Speichercontainer für eine Array-Struktur. Standardmäßig ist die Array-Länge auf 10 eingestellt. Natürlich können wir die Anfangslänge auch selbst beim Aufbau des ArrayList-Objekts angeben. Da der ArrayList im Programm kontinuierlich Daten hinzugefügt werden, verfügt die ArrayList nicht über überschüssige Kapazität zum Speichern nachfolgender Daten, wenn die hinzugefügten Daten 10 erreichen. Zu diesem Zeitpunkt löst ArrayList automatisch die Erweiterung aus. Der spezifische Prozess der Erweiterung ist sehr einfach:

  1. Erstellen Sie zunächst ein neues Array, dessen Länge das 1,5-fache der Länge des ursprünglichen Arrays beträgt.
  2. Verwenden Sie dann die Methode Arrays.copyOf, um die Daten im alten Array in das neue Array zu kopieren. Nach Abschluss der Erweiterung werden die hinzuzufügenden Elemente dem neuen Array hinzugefügt, um den dynamischen Erweiterungsprozess abzuschließen.

Erweiterungszeitpunkt: Erweiterung beim Hinzufügen von Elementen, wenn die Anzahl der Elemente + 1 > die aktuelle Array-Länge [Größe + 1 > elementData.length]

15.Was sind die Vor- und Nachteile von CopyOnWriteArrayList?

  1. Speichernutzung: Wenn CopyOnWriteArrayList häufig Daten in der Sammlung hinzufügt, löscht oder ändert und die Methoden add(), set() und remove() ausführt, muss jedes Mal ein neues Array kopiert werden, was Speicher verbraucht.

  2. Datenkonsistenz: Der CopyOnWrite-Container kann nur die endgültige Konsistenz der Daten garantieren, jedoch nicht die Echtzeitkonsistenz der Daten, da die Hinzufügungs-, Lösch- und Änderungsvorgänge auf dem neuen Array und die Lesevorgänge auf dem neuen Array erfolgen ursprüngliches Array.

  • Mangel:

Speicheraufwand:

Die Kernfunktion von CopyOnWriteArrayList besteht darin, das gesamte zugrunde liegende Array bei einem Schreibvorgang zu kopieren, was bedeutet, dass ein Schreibvorgang eine neue Kopie des Arrays erstellt. Dies kann zu viel Speicheraufwand führen, insbesondere wenn die Liste groß ist.
Wenn häufig in die Liste geschrieben wird, kann dies zu einem erheblichen Speicherzuweisungs- und Speicherbereinigungsaufwand führen.
Verzögerung des Schreibvorgangs:

Da der Schreibvorgang das Kopieren des gesamten zugrunde liegenden Arrays umfasst, beträgt die zeitliche Komplexität des Schreibvorgangs O(n), wobei n die Größe der Liste ist. Dies bedeutet, dass Schreibvorgänge relativ langsam sein können, insbesondere wenn die Liste groß ist.
Die Latenz von Schreibvorgängen kann bei einigen echtzeitkritischen Anwendungen zu Problemen führen.

  • Vorteile:
    Thread-Sicherheit: CopyOnWriteArrayList bietet Thread-Sicherheit. Sein Design ermöglicht es mehreren Threads, die Liste gleichzeitig zu lesen, ohne dass zusätzliche Synchronisationsmechanismen erforderlich sind. Dadurch eignet es sich sehr gut für Szenarien, in denen viel gelesen und wenig geschrieben wird.

Vermeiden Sie gleichzeitige Änderungsausnahmen: Da der Schreibvorgang von CopyOnWriteArrayList das zugrunde liegende Array kopiert, hat der Schreibvorgang keinen Einfluss auf den laufenden Lesevorgang und verursacht keine gleichzeitigen Änderungsausnahmen (ConcurrentModificationException).

Konsistente Iteration: Wenn Sie über CopyOnWriteArrayList iterieren, greift der Iterator auf den Snapshot zu, als der Iterator erstellt wurde, und wird von Änderungen durch andere Threads nicht beeinflusst. Dies gewährleistet eine konsistente Iteration, d. h. der Iterator löst keine gleichzeitigen Änderungsausnahmen aus und gibt keine inkonsistenten Daten zurück.

Vereinfachter Code: Da CopyOnWriteArrayList über eine integrierte Thread-Sicherheit verfügt, müssen Sie keinen zusätzlichen Synchronisationscode schreiben, was den Code vereinfachen und die Programmierschwierigkeiten verringern kann.

Vorhersehbare Leistung: CopyOnWriteArrayList kopiert beim Schreiben das gesamte zugrunde liegende Array, was zu einer schlechten Leistung bei Schreibvorgängen führen kann. Bei mehr Lesevorgängen und weniger Schreibvorgängen ist der Overhead der Schreibvorgänge jedoch kontrollierbar, während die Leistung der Lesevorgänge hoch ist. Dadurch leistet CopyOnWriteArrayList in bestimmten Anwendungsfällen eine gute Leistung.

Geeignet für Datensätze, die sich selten ändern: Wenn sich der Datensatz selten ändert und hauptsächlich für Lesevorgänge verwendet wird, kann CopyOnWriteArrayList eine konsistente, schnelle Leseleistung bieten.

  • Anwendbare Szene:

Obwohl CopyOnWriteArrayList einige Nachteile hat, kann es in bestimmten Anwendungsfällen dennoch sehr nützlich sein:

Mehr lesen und weniger schreiben:

Wenn die Liste viel häufiger gelesen als geschrieben wird, kann CopyOnWriteArrayList eine effiziente Thread-Sicherheit bieten, da die Lesevorgänge nicht durch die Schreibvorgänge blockiert werden.
Daten ändern sich selten:

CopyOnWriteArrayList kann eine konstant schnelle Leseleistung bieten, wenn sich der Datensatz der Liste nicht häufig ändert, und wird hauptsächlich für Lesevorgänge verwendet.
Erfordert keine Echtzeitleistung:

Wenn die Anwendung keine hohen Echtzeitanforderungen für Schreibvorgänge hat und die Verzögerung von Schreibvorgängen tolerieren kann, ist CopyOnWriteArrayList möglicherweise eine geeignete Wahl.
Vermeiden Sie eine explizite Synchronisierung:

Wenn Sie die Verwendung expliziter Synchronisierungsmechanismen (z. B. Sperren) vermeiden möchten, aber eine threadsichere Liste benötigen, bietet CopyOnWriteArrayList eine einfache Alternative.
Es ist zu beachten, dass nicht alle Szenarien für die Verwendung von CopyOnWriteArrayList geeignet sind. Wenn die Schreibvorgänge der Liste häufig sind und hohe Echtzeitanforderungen stellen oder die Größe der Liste sehr groß ist, müssen Sie möglicherweise andere threadsichere Datenstrukturen wie ConcurrentHashMap oder einen benutzerdefinierten Sperrmechanismus in Betracht ziehen. Daher sollten bei der Auswahl einer Datenstruktur die Vor- und Nachteile der Verwendung von CopyOnWriteArrayList gegen Ihre spezifischen Bedürfnisse und Leistungsanforderungen abgewogen werden.

16.Was ist das Implementierungsprinzip von CopyOnWriteArrayList?

  1. Das Grundprinzip aller Änderungsvorgänge von CopyOnWriteArrayList besteht darin, eine neue Kopie des Arrays zu erstellen.
  2. Wenn CopyOnWriteArrayList geändert werden muss, wird der ursprüngliche Inhalt nicht geändert, sondern die Originaldaten werden einmal kopiert, der geänderte Inhalt wird in eine neue Kopie geschrieben und dann wird die Änderung vorgenommen

17. Warum ist die Parallelität von CopyOnWriteArrayList sicher und bietet eine bessere Leistung als Vector?

  1. In Vector sind alle Methoden zum Hinzufügen, Löschen, Ändern und Suchen synchronisiert, um die Synchronisierung sicherzustellen. Bei der Ausführung muss jedoch jede Methode eine Sperre erwerben, wodurch die Leistung erheblich verringert wird.
  2. CopyOnWriteArrayList sperrt nur Hinzufügungen, Löschungen und Änderungen, jedoch nicht das Lesen. Seine Leseleistung ist besser als die von Vector. CopyOnWriteArrayList unterstützt gleichzeitige Situationen mit mehr Lesen und weniger Schreiben . Lesen und Schreiben werden getrennt, beim Schreiben wird ein neues Array kopiert und das neue Array wird dem Array zugewiesen, nachdem der Einfügungs-, Änderungs- oder Entfernungsvorgang abgeschlossen ist.

18.Wie prüft HashSet auf Duplikate?

1. Wenn ein Objekt zum HashSet hinzugefügt wird, berechnet HashSet zunächst den HashCode-Wert des Objekts, um die Position zu bestimmen, an der das Objekt hinzugefügt wird. Wenn sich an der Position keine anderen Elemente befinden, bedeutet dies, dass keine Duplizierung vorliegt. 2. Wenn sich an der Position andere Elemente befinden, wird die verknüpfte Liste an der Position verglichen
. Der HashCode-Wert anderer Elemente im Element. Wenn kein gleicher HashCode vorhanden ist, bedeutet dies keine Duplizierung.
3. Wenn derselbe HashCode vorhanden ist Wenn es gefunden wird, wird die Methode equal() aufgerufen, um zu überprüfen, ob die beiden Elemente gleich sind. Wenn equal() vergleicht, ist das Ergebnis wahr, was bedeutet, dass es wiederholt wird, andernfalls bedeutet es, dass es nicht wiederholt wird.

19.ConcurrentHashMap-Funktionen und zugrunde liegende Prinzipien?

Referenz: Vergleich von HashMap, HashTable und CurrentHashMap

20. Wie konvertiere ich ein Array in eine Liste?

Arrays können mit der Methode Arrays.asList(T… a) in Listen konvertiert werden.

21.Was sind die internen Unterschiede zwischen HashSet und LinkedHashSet?

22. Wie finde ich heraus, ob ein Element in einer Sammlung vorhanden ist?

Verwenden Sie die Methode „contains(Object obj)“, um zu überprüfen, ob das angegebene Element in der Sammlung enthalten ist.

23.Was sind threadsichere Sammlungen? Ihre zugrunde liegende Implementierung?

Zu den Thread-sicheren Sammlungen gehören Vector, HashTable, Stack, ArrayBlockingQueue, ConcurrentHashMap, ConcurrentLinkedQueue usw.

Supongo que te gusta

Origin blog.csdn.net/qq_42785250/article/details/132969277
Recomendado
Clasificación