Biraz geç olabilir ama işte benim iki sentim.
Java 8 kullanıyorsanız, computeIfPresent yöntemini kullanabilirsiniz . Belirtilen anahtarın değeri varsa ve null değilse, anahtar ve geçerli eşlenen değeri göz önüne alındığında yeni bir eşleme hesaplamaya çalışır.
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]
Bir anahtar koymak için putIfAbsent yöntemini de kullanabiliriz . Belirtilen anahtar zaten bir değerle ilişkilendirilmemişse (veya null ile eşlenmişse), bu yöntem bunu verilen değerle ilişkilendirir ve null değerini döndürür, aksi takdirde geçerli değeri döndürür.
Haritanın iş parçacıkları arasında paylaşılması durumunda ConcurrentHashMap
ve AtomicInteger'den yararlanabiliriz . Dokümandan:
A AtomicInteger
, atomik olarak güncellenebilecek bir int değeridir. AtomicInteger, atomik olarak artırılmış sayaçlar gibi uygulamalarda kullanılır ve bir Tamsayı'nın yerine kullanılamaz. Ancak, bu sınıf, sayısal tabanlı sınıflarla ilgilenen araç ve yardımcı programlarla eşit erişim sağlamak için Number'ı genişletir.
Bunları gösterildiği gibi kullanabiliriz:
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]
Gözlemlememiz gereken bir nokta, get
anahtarın değerini almaya B
çağırıyoruz ve sonra incrementAndGet()
elbette ki değerini çağırıyoruz AtomicInteger
. Yöntem putIfAbsent
, zaten varsa anahtarın değerini döndürdüğü için optimize edebiliriz :
map2.putIfAbsent("B",new AtomicInteger(0)).incrementAndGet();//[A=0, B=2]
Kullandığımız planlıyorsanız Yan not AtomicLong verimi beklenen yüksek çekişme altında belgelendirmesi olarak daha sonra LongAdder yüksek uzay tüketimi pahasına, önemli ölçüde daha yüksektir. Ayrıca bu soruyu kontrol edin .