Überschreibt "put" vorhandene Werte?

73

Neu in Hashtabellen mit einer einfachen Frage. Aus irgendeinem Grund hat mir das Googeln keine klare Antwort gegeben. Angenommen, ich habe eine <int,String>Hashtabelle eingerichtet:

myHashtable.put(1,"bird");
myHashtable.put(2,"iguana");

und ich möchte "Vogel" in "Fisch" ändern (und den Index gleich lassen). Kann ich einfach einen putEintrag machen oder muss ich den Eintrag löschen oder was?

Ben
quelle
8
Wenn Sie verstehen möchten, wie eine bestimmte Java-API funktioniert, verschwenden Sie keine Zeit mit "Googeln". Gehen Sie einfach zu den Online-Javadocs für die Klasse und lesen Sie die Dokumente für die Klasse / Methode.
Stephen C
1
Ich habe diese Dokumentation gelesen, war aber in der Zeile "return" etwas unklar: der vorherige Wert des angegebenen Schlüssels in dieser Hashtabelle oder null, wenn er keinen hatte. Es hört sich so an, als würde der alte Wert zurückgegeben.
Ben
Sie verwenden nicht den putim Beispiel zurückgegebenen Wert , daher sehe ich nicht, wie relevant dieser Teil des Javadoc für Sie ist. Aber der Javadoc ist kristallklar ... der alte Wert wird zurückgegeben, falls es einen gab.
Stephen C

Antworten:

87

Ja.

Wenn bereits eine Zuordnung zum angegebenen Schlüssel vorhanden ist, wird der alte Wert ersetzt (und zurückgegeben). Siehe Hashtable.put().

Für eine Umgebung mit mehreren Threads würde ich eine ConcurrentHashMapandere ConcurrentMapImplementierung empfehlen . Obwohl Hashtablesynchronisiert, stehen jetzt komplexere Implementierungen für die gleichzeitige Zuordnung zur Verfügung, z. B. Guavas MapMakerund CacheBuilder.

Denken Sie auch daran Map, dass die Typparameter vorhanden sein werden, <Integer, String>da primitive Typparameter nicht unterstützt werden.

Paul Bellora
quelle
OK toll, danke. Ich habe diese Dokumentation gelesen, war aber in der Zeile "Retouren" etwas unklar : the previous value of the specified key in this hashtable, or null if it did not have one. Es klingt wie der alte Wert zurückgegeben wird ... trotzdem zurück zum Code, wird einen Blick darauf werfen.
Ben
Ja, Sie erhalten den alten Wert zurück. Das Überprüfen auf nullist also eine gute Möglichkeit, um festzustellen, ob Sie beispielsweise nur puteinen neuen Schlüssel haben.
Paul Bellora
Er kann ein intals Schlüssel verwenden, da Java es automatisch in eine Ganzzahl kopiert.
Paul
@ Paul verstanden, aber ich bezog mich auf die Typparameter derMap
Paul Bellora
Dies hat mich zunächst verwirrt, da wir in meiner Datenstrukturklasse viel Zeit darauf verwendet haben, die verschiedenen Möglichkeiten für den Umgang mit Kollisionen zu erörtern, z. B. das Element am nächsten verfügbaren Index oder das Einfügen von Arrays in jeden Schlüssel. Ich konnte mir nicht vorstellen, dass die Implementierung von Java dafür die einfachste mögliche Lösung wäre - wenn eine Kollision auftritt, ignorieren Sie den alten Wert! Dies ist natürlich eine äußerst nützliche Methode, um Hash Maps zu einer großartigen Datenstruktur für sehr viele Probleme zu machen (oder für jedes Problem, wenn Sie an Interviewfragen glauben).
Jeremy