Es mag etwas spät sein, aber hier sind meine zwei Cent.
Wenn Sie Java 8 verwenden, können Sie die computeIfPresent- Methode verwenden. Wenn der Wert für den angegebenen Schlüssel vorhanden und nicht null ist, wird versucht, eine neue Zuordnung unter Berücksichtigung des Schlüssels und seines aktuellen zugeordneten Werts zu berechnen.
final Map<String,Integer> map1 = new HashMap<>();
map1.put("A",0);
map1.put("B",0);
map1.computeIfPresent("B",(k,v)->v+1); //[A=0, B=1]
Wir können auch eine andere Methode putIfAbsent verwenden , um einen Schlüssel zu setzen. Wenn der angegebene Schlüssel noch keinem Wert zugeordnet ist (oder null zugeordnet ist), ordnet diese Methode ihn dem angegebenen Wert zu und gibt null zurück, andernfalls wird der aktuelle Wert zurückgegeben.
Falls die Karte über Threads gemeinsam genutzt , dann können wir nutzen ConcurrentHashMap
und Atomicinteger . Aus dem Dokument:
An AtomicInteger
ist ein int-Wert, der atomar aktualisiert werden kann. Eine AtomicInteger wird in Anwendungen wie z. B. atomar inkrementierten Zählern verwendet und kann nicht als Ersatz für eine Ganzzahl verwendet werden. Diese Klasse erweitert jedoch Number, um einen einheitlichen Zugriff für Tools und Dienstprogramme zu ermöglichen, die sich mit numerisch basierten Klassen befassen.
Wir können sie wie gezeigt verwenden:
final Map<String,AtomicInteger> map2 = new ConcurrentHashMap<>();
map2.putIfAbsent("A",new AtomicInteger(0));
map2.putIfAbsent("B",new AtomicInteger(0)); //[A=0, B=0]
map2.get("B").incrementAndGet(); //[A=0, B=1]
Ein zu beachtender Punkt ist, dass wir aufrufen get
, um den Wert für den Schlüssel zu erhalten, B
und dann incrementAndGet()
dessen Wert aufrufen , was natürlich der Fall ist AtomicInteger
. Wir können es optimieren, da die Methode putIfAbsent
den Wert für den Schlüssel zurückgibt, falls dieser bereits vorhanden ist:
map2.putIfAbsent("B",new AtomicInteger(0)).incrementAndGet();//[A=0, B=2]
Nebenbei bemerkt, wenn wir vorhaben, AtomicLong zu verwenden, ist der erwartete Durchsatz von LongAdder gemäß der Dokumentation unter hohen Konflikten auf Kosten eines höheren Platzverbrauchs erheblich höher. Überprüfen Sie auch diese Frage .