Heim  >  Artikel  >  Java  >  Detaillierte Erläuterung der Verwendung von Map in Java

Detaillierte Erläuterung der Verwendung von Map in Java

高洛峰
高洛峰Original
2017-01-19 10:40:331350Durchsuche

Einführung in Map

Ein Objekt, das Schlüssel Werten zuordnet. Eine Zuordnung darf keine doppelten Schlüssel enthalten; jeder Schlüssel kann höchstens einem Wert zugeordnet werden. Diese Schnittstelle ersetzt die Dictionary-Klasse, die eher eine abstrakte Klasse als eine Schnittstelle ist.

Die Map-Schnittstelle bietet drei Sammlungsansichten, mit denen Sie den Inhalt einer Map in Form eines Schlüsselsatzes, eines Wertesatzes oder eines Schlüssel-Wert-Zuordnungsbeziehungssatzes anzeigen können. Die Zuordnungsreihenfolge ist als die Reihenfolge definiert, in der ein Iterator seine Elemente in einer zugeordneten Sammlungsansicht zurückgibt. Einige Mapping-Implementierungen können ihre Reihenfolge explizit garantieren, wie zum Beispiel die TreeMap-Klasse; andere Mapping-Implementierungen garantieren die Reihenfolge nicht, wie zum Beispiel die HashMap-Klasse.

Hinweis: Sie müssen vorsichtig sein, wenn Sie veränderliche Objekte als Kartenschlüssel verwenden. Wenn ein Objekt ein Schlüssel in einer Karte ist, ist das Verhalten der Karte undefiniert, wenn der Wert des Objekts in einer Weise geändert wird, die sich auf Gleichheitsvergleiche auswirkt. Ein Sonderfall dieses Verbots ist das Verbot, dass eine Karte sich selbst als Schlüssel enthält. Obwohl eine Karte sich selbst als Wert enthalten darf, seien Sie vorsichtig: Die Methoden equal und hashCode sind auf einer solchen Karte nicht mehr genau definiert.

Kartenschnittstelle:

Karte bietet Schlüssel zur Wertzuordnung. Eine Map kann nicht denselben Schlüssel enthalten und jeder Schlüssel kann nur einen Wert zuordnen. Die Map-Schnittstelle bietet drei Arten von Satzansichten. Der Inhalt der Karte kann als Satz von Schlüsselsätzen, als Satz von Wertsätzen oder als Satz von Schlüsselwertzuordnungen betrachtet werden. ​

Hashtable-Klasse ​ ​

Hashtable erbt die Map-Schnittstelle und implementiert eine Hash-Tabelle der Schlüsselwertzuordnung. Als Schlüssel oder Wert kann jedes Nicht-Null-Objekt verwendet werden. ​​

Um Daten hinzuzufügen, verwenden Sie put(key, value) und um Daten zu entfernen, verwenden Sie get(key). Der Zeitaufwand dieser beiden Grundoperationen ist konstant. Hashtable passt die Leistung über zwei Parameter an: Anfangskapazität und Auslastungsfaktor. Normalerweise erreicht der Standardlastfaktor 0,75 ein besseres Gleichgewicht zwischen Zeit und Raum. Durch Erhöhen des Auslastungsfaktors kann Platz gespart werden, die entsprechende Suchzeit erhöht sich jedoch, was sich auf Vorgänge wie „Abrufen“ und „Put“ auswirkt.

Ein einfaches Beispiel für die Verwendung von Hashtable ist wie folgt: Geben Sie 1, 2 und 3 in die Hashtable ein, und ihre Schlüssel sind „eins“, „zwei“ bzw. „drei“:

Hashtable numbers = new Hashtable(); 
numbers.put(“one”, new Integer(1)); 
numbers.put(“two”, new Integer(2)); 
numbers.put(“three”, new Integer(3));

Um eine Zahl, z. B. 2, herauszunehmen, verwenden Sie den entsprechenden Schlüssel:

Integer n = (Integer)numbers.get(“two”); 
System.out.println(“two = ” + n);

Da das Objekt als Schlüssel dient Berechnen Sie die Position des entsprechenden Werts durch Berechnung seiner Hash-Funktion. Daher muss jedes als Schlüssel verwendete Objekt die Methoden hashCode und equal implementieren. Die Methoden hashCode und equal erben von der Stammklasse Object. Wenn Sie eine benutzerdefinierte Klasse als Schlüssel verwenden, seien Sie gemäß der Definition der Hash-Funktion sehr vorsichtig, wenn die beiden Objekte gleich sind, d. h. obj1.equals( obj2)=true, dann muss ihr HashCode gleich sein, aber wenn zwei Objekte unterschiedlich sind, ist ihr HashCode nicht unbedingt unterschiedlich. Wenn der HashCode zweier verschiedener Objekte gleich ist, wird dieses Phänomen als Konflikt bezeichnet Der Zeitaufwand für den Betrieb der Hash-Tabelle erhöht sich. Versuchen Sie daher, eine genau definierte hashCode()-Methode zu definieren, um die Hash-Tabellenoperationen zu beschleunigen.

Wenn dasselbe Objekt einen anderen Hash-Code hat, führt die Operation der Hash-Tabelle zu unerwarteten Ergebnissen (die erwartete Get-Methode gibt null zurück. Um dieses Problem zu vermeiden, müssen Sie sich nur eines merken: gleichzeitig kopieren). Die Zeit entspricht der Methode und der HashCode-Methode, anstatt nur eine davon zu schreiben.

Hashtable ist synchron.

HashMap-Klasse

HashMap ähnelt Hashtable, mit der Ausnahme, dass HashMap asynchron ist und Null zulässt, d. h. Nullwert und Nullschlüssel. , aber wenn HashMap als Sammlung behandelt wird (die Methode „values()“ kann eine Sammlung zurückgeben), ist der Zeitaufwand ihrer Iterationsunteroperationen proportional zur Kapazität der HashMap. Wenn die Leistung iterativer Vorgänge wichtig ist, sollten Sie daher die Anfangskapazität von HashMap nicht zu hoch und den Auslastungsfaktor nicht zu niedrig einstellen.

WeakHashMap-Klasse

WeakHashMap ist eine verbesserte HashMap, die eine „schwache Referenz“ für den Schlüssel implementiert. Wenn ein Schlüssel nicht mehr extern referenziert wird, kann der Schlüssel recycelt werden von GC.

Das Obige ist eine Einführung in die Java Map-Schnittstelle. Schüler, die Java-Programmierung lernen, können darauf zurückgreifen.

Ausführlichere Erläuterungen zur Verwendung von Map in Java und verwandte Artikel finden Sie auf der chinesischen PHP-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