Frage

Normalerweise (dh. Nicht gleichzeitig), putAll() nicht effizienter als viele der mit der Anrufe sogar put(), vorausgesetzt, dass Sie die Kosten für den Aufbau der anderen Karte auszuschließen, die Sie putAll() passieren. Das ist, weil putAll() benötigen die übergebenen-Karte Elemente sowie Laufen durch den Algorithmus zur Iteration für das Hinzufügen jedes Schlüsselwertpaar auf die Karte, die ausgeführt wird put().

Aber für eine ConcurrentHashMap, macht es Sinn, eine regelmäßige Karte zu konstruieren und dann verwenden putAll() es zu aktualisieren? Oder sollte ich nur 10 tun (oder 100 oder 1000) ruft put()?

Ist für mehrere Anrufe die Antwort Änderung putIfAbsent()?

Danke!

War es hilfreich?

Lösung

Die erste (meist) THREAD Karte in Java Collections wurde die synchronisierte HashMap mit Collections.synchronizedMap() . Es funktionierte nur von einem Betrieb zu einem Zeitpunkt ermöglicht. 5 Java hinzugefügt der ConcurrentHashMap , das funktioniert anders. Grundsätzlich ist der Map wird in Scheiben geteilt. Ein put() Betrieb wird nur die entsprechende Scheibe sperren. Er fügte hinzu, auch die THREAD Primitiven wie putIfAbsent() .

Der Grund, warum ich das erklären ist, dass putAll() könnte sein, mehr oder weniger effizient je nachdem, wie es umgesetzt wird. Es kann arbeiten, indem sie die ganze Karte sperrt, die eigentlich effizienter sein können als der Versuch, einzelne Sperren auf jedem put() zu erhalten. Oder es kann sowieso, indem Sie eine Reihe von put() Anrufen arbeitet, wobei in diesem Fall gibt es nicht viel Unterschied.

Also, wenn es sinnvoll, den Code macht und Sie eine Menge Updates auf einmal zu tun, würde ich putAll() verwenden, es sei denn es ist putIfAbsent(), die Sie nach.

Edit: Ich habe gerade überprüft, implementiert die Java 6 ConcurrentHashMap putAll() als eine Schleife von put() Operationen, so dass es nicht besser oder schlechter als dies selbst zu tun

.

Andere Tipps

putAll() nur Delegierten put(). Es gibt keine Notwendigkeit, eine Zwischen Karte aufzubauen, wenn Sie es nicht bereits getan haben. Sie können dies im Quellcode sehen, und es ist egal, was Java-Implementierung Sie verwenden, da der Code Public Domain und geteilt durch alle von ihnen.

Beachten Sie, dass putAll() nicht atomar ist, sondern hat lediglich die Garantie, dass jeder einzelne put() Atom ist.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top