Heim >类库下载 >java类库 >HashSet HashTable und TreeSet

HashSet HashTable und TreeSet

高洛峰
高洛峰Original
2016-11-01 15:01:121827Durchsuche

Die Klasse

HashSet

HashSet ist hauptsächlich für leistungsstarke Mengenoperationen wie Schnittmenge, Vereinigung, Differenz usw. zweier Mengen konzipiert. Eine Menge enthält eine Menge von Elementen, die nicht wiederholt vorkommen und keine Reihenfolge von Attributen haben.

HashSet Einige Funktionen sind wie folgt:

1. Die Werte in HashSet können nicht wiederholt werden und es gibt keine Reihenfolge.

2. Die Kapazität von HashSet wird bei Bedarf automatisch hinzugefügt.

Konstruktor:

HashSet() Der Standard-Gleichheitskomparator erstellt eine leere neue Instanz.

HashSet(IEnumerable Sammlung) Kopiert die Daten in der Sammlung in der angegebenen Sammlung in die Sammlung

HashSet(IEqualityComparer Vergleicher) Erstellt einen leeren Vergleich mit dem angegebenen Gleichheitskomparator Neue Instanz

HashSet(IEnumerable Sammlung,IEqualityComparerVergleicher) Instanziiert Daten mithilfe des angegebenen Komparators und kopiert die Elemente in der angegebenen Sammlung in die Sammlung.

Da HashSet speziell für die Durchführung von Mengenoperationen entwickelt wurde, beziehen sich viele der bereitgestellten Methoden auf Mengenoperationen.

Im Folgenden finden Sie eine Einführung in einige seiner gängigen Methoden

Beschreibung des Mitgliedstyps

Methode hinzufügen fügt das angegebene Element zur Sammlung hinzu

Clear-Methode löscht Die Sammlung Alle Elemente in

Contains  Methode bestimmt, ob ein Element in HashSet ist

Exists  Methode bestimmt, ob HashSet Elemente enthält, die angegebenen Bedingungen entsprechen

ExceptWith-Methode Entfernt alle Elemente in der angegebenen Sammlung aus dem aktuellen HashSet

IntersectWith-Methode ändert das aktuelle HashSet-Objekt so, dass es nur dieses Objekt und Elemente enthält, die in der angegebenen Sammlung vorhanden sind

IsProperSubsetOf Methode bestimmt, ob das HashSet-Objekt eine wahre Teilmenge der angegebenen Menge ist

IsProperSupersetOf-Methode bestimmt, ob das HashSet-Objekt eine wahre Obermenge der angegebenen Menge ist

IsSunsetOf  Methode bestimmt ob HashSetOb das Objekt eine Teilmenge der angegebenen Menge ist

IsSupersetOf  Die Methode bestimmt, ob das HashSet-Objekt eine Obermenge der angegebenen Menge ist

Remove   Die Methode entfernt das angegebene Element aus dem HashSet-Objekt

RemoveWhere  Die Methode entfernt alle Elemente aus der HashSet-Sammlung, die den durch das angegebene Prädikat definierten Bedingungen entsprechen

SetEquals  Die Methode bestimmt, ob das HashSet-Objekt ist im angegebenen Satz enthalten. Gleiche Elemente. Die

SynmmetricExceptWith -Methode ändert das aktuelle HashSet-Objekt so, dass es nur Elemente enthält, die im Objekt oder der angegebenen Sammlung vorhanden sind.

TrimExcess -Methode legt die Kapazität des fest HashSet-Objekt auf Die tatsächliche Anzahl der darin enthaltenen Elemente, aufgerundet auf den nächsten Eigenschafts- und Implementierungswert. Die

UnionWith -Methode ändert das aktuelle HashSet-Objekt so, dass es das Objekt selbst und alle in der angegebenen Sammlung vorhandenen Elemente enthält

TreeSet

TreeSet wird mithilfe von TreeMap implementiert.
TreeSet ist eine geordnete Menge. Die Elemente in TreeSet werden in aufsteigender Reihenfolge angeordnet. Dies bedeutet, dass die Elemente in TreeSet die Comparable-Schnittstelle implementieren müssen. Oder haben Sie einen benutzerdefinierten Komparator.
Wir können beim Erstellen des TreeSet-Objekts das Komparatorobjekt übergeben, das die Comparator-Schnittstelle implementiert.

Der Unterschied zwischen TreeSet und HashSet

1. HashSet wird über HashMap implementiert, TreeSet wird über TreeMap implementiert, aber Set verwendet nur den Map-Schlüssel

2. Kartenschlüssel und Sets haben ein gemeinsames Merkmal, nämlich die Einzigartigkeit des Sets.

3. hashCode und equal() werden von HashMap verwendet Zum Sortieren müssen Sie sich nur auf Positionierung und Einzigartigkeit konzentrieren.

a. hashCode wird zur Berechnung von Hash-Werten und Hash-Werte zur Bestimmung von Hash-Tabellenindizes verwendet.

b. Ein Index in der Hash-Tabelle speichert eine verknüpfte Liste, daher ist es notwendig, die Equal-Methode zu durchlaufen, um jedes Objekt in der Kette wirklich zu lokalisieren, um den Eintrag zu finden, der dem Schlüsselwert entspricht. Wenn es sich nicht in der Hash-Tabelle befindet, fügen Sie einen Eintrag vor der verknüpften Liste hinzu. Wenn er gefunden wird, ersetzen Sie den Wert im Eintrag und geben Sie den alten Wert zurück

4 , Der Schlüsselwert wird in der Größe verglichen. Natürlich kann er auch mit Comparator

b angegeben werden Beim Erstellen wird die Methode key.compareTo( verwendet), die erfordert, dass der Schlüssel die Comparable-Schnittstelle implementiert.

c Schnittstelle vergleichen.

HashTable

Hashtables (Hash-Tabellen) sind kein neues Konzept im Computerbereich. Sie wurden entwickelt, um die Computerverarbeitung zu beschleunigen, die nach heutigen Maßstäben sehr langsam ist, und ermöglichen es Ihnen, bei der Abfrage vieler Dateneinträge schnell einen bestimmten Eintrag zu finden. Obwohl moderne Maschinen tausende Male schneller sind, sind Hashtabellen immer noch ein nützliches Werkzeug, um die beste Leistung aus Ihren Anwendungen herauszuholen.

Hashtable- und HashMap-Objekte ermöglichen es Ihnen, einen Schlüssel und einen Wert zu kombinieren und das Schlüssel/Wert-Paar mithilfe der put()-Methode in die Tabelle einzugeben. Anschließend können Sie den Wert abrufen, indem Sie die Methode get() aufrufen und den Schlüssel als Parameter übergeben. Schlüssel und Wert können beliebige Objekte sein, solange sie zwei Grundanforderungen erfüllen. Beachten Sie, dass primitive Typen mithilfe von Methoden wie Integer (int) in Objekte konvertiert werden müssen, da Schlüssel und Werte Objekte sein müssen.

Um ein Objekt einer bestimmten Klasse als Schlüssel zu verwenden, muss diese Klasse zwei Methoden bereitstellen, equal() und hashCode(). Diese beiden Methoden befinden sich in java.lang.Object, sodass alle Klassen diese beiden Methoden erben können. Die Implementierung dieser beiden Methoden in der Object-Klasse ist jedoch im Allgemeinen nutzlos, sodass Sie diese beiden Methoden normalerweise selbst überladen müssen.

Die Equals()-Methode vergleicht ihr Objekt mit einem anderen Objekt und gibt true zurück, wenn die beiden Objekte dieselben Informationen darstellen. Diese Methode stellt außerdem sicher, dass beide Objekte derselben Klasse angehören. Wenn es sich bei den beiden Referenzobjekten um identische Objekte handelt, gibt Object.equals() true zurück, weshalb diese Methode grundsätzlich nicht geeignet ist. In den meisten Fällen benötigen Sie eine Möglichkeit, Feld für Feld zu vergleichen. Daher betrachten wir verschiedene Objekte, die dieselben Daten darstellen, als gleich.

Die HashCode()-Methode generiert einen int-Wert, indem sie eine Hash-Funktion unter Verwendung des Inhalts des Objekts ausführt. Hashtable und HashMap verwenden diesen Wert, um herauszufinden, in welchem ​​Bucket (oder welcher Liste) sich ein Schlüssel/Wert-Paar befindet. Hashtable-Leistung
Der Hauptfaktor, der die Effizienz von Hashtable beeinflusst, ist die durchschnittliche Länge der Liste in der Tabelle, da die durchschnittliche Suchzeit direkt mit dieser durchschnittlichen Länge zusammenhängt. Um die durchschnittliche Länge zu reduzieren, müssen Sie natürlich die Anzahl der Listen in der Hashtabelle erhöhen. Die beste Sucheffizienz erzielen Sie, wenn die Anzahl der Listen so groß ist, dass die meisten oder alle Listen nur einen Datensatz enthalten. Dies geht jedoch möglicherweise zu weit. Wenn Ihre Hashtabelle weitaus mehr Listen als Dateneinträge enthält, müssen Sie keinen solchen Speicheraufwand verursachen, und in manchen Fällen ist es für die Leute unmöglich, diesen Ansatz zu akzeptieren.

ashtable und HashMap
Die Klassen Hashtable und HashMap weisen drei wichtige Unterschiede auf. Der erste Unterschied ist hauptsächlich auf historische Gründe zurückzuführen. Hashtable basiert auf der alten Dictionary-Klasse und HashMap ist eine Implementierung der in Java 1.2 eingeführten Map-Schnittstelle.

Der vielleicht wichtigste Unterschied besteht darin, dass die Methoden von Hashtable synchron sind, die Methoden von HashMap hingegen nicht. Dies bedeutet, dass Sie, obwohl Sie eine Hashtable in einer Multithread-Anwendung verwenden können, ohne besondere Maßnahmen zu ergreifen, auch eine externe Synchronisierung für eine HashMap bereitstellen müssen. Eine praktische Methode ist die Verwendung der statischen synchronisiertMap()-Methode der Collections-Klasse, die ein threadsicheres Map-Objekt erstellt und es als gekapseltes Objekt zurückgibt. Mit den Methoden dieses Objekts können Sie synchron auf die zugrunde liegende HashMap zugreifen. Dies hat zur Folge, dass Sie die Synchronisierung in der Hashtable nicht unterbrechen können, wenn Sie sie nicht benötigen (z. B. in einer Single-Thread-Anwendung) und die Synchronisierung einen hohen Verarbeitungsaufwand verursacht.

Der dritte Unterschied besteht darin, dass Sie nur mit HashMap Nullwerte als Schlüssel oder Wert eines Tabelleneintrags verwenden können. Nur ein Datensatz in einer HashMap kann ein leerer Schlüssel sein, aber eine beliebige Anzahl von Einträgen kann ein leerer Wert sein. Dies bedeutet, dass get() null zurückgibt, wenn der Suchschlüssel nicht in der Tabelle gefunden wird oder wenn der Suchschlüssel gefunden wird, aber ein Nullwert ist. Verwenden Sie bei Bedarf die Methode „containKey()“, um zwischen diesen beiden Situationen zu unterscheiden.


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