มันอาจจะช้าไปหน่อย แต่นี่คือสองเซ็นต์ของฉัน
หากคุณใช้ Java 8 คุณสามารถใช้วิธีการcomputeIfPresent หากค่าสำหรับคีย์ที่ระบุมีอยู่และไม่เป็นโมฆะมันจะพยายามคำนวณการแม็พใหม่ที่กำหนดคีย์และค่าที่แม็พปัจจุบัน
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]
นอกจากนี้เรายังสามารถใช้วิธีอื่นputIfAbsentจะใส่กุญแจ หากคีย์ที่ระบุไม่ได้เชื่อมโยงกับค่า (หรือแมปเป็นโมฆะ) วิธีการนี้จะเชื่อมโยงกับค่าที่กำหนดและส่งกลับค่า null มิฉะนั้นจะส่งกลับค่าปัจจุบัน
ในกรณีที่แผนที่จะใช้ร่วมกันในหัวข้อแล้วเราสามารถทำให้การใช้งานConcurrentHashMap
และAtomicInteger จากเอกสาร:
AtomicInteger
เป็นค่า int ที่อาจได้รับการปรับปรุงอะตอม AtomicInteger ใช้ในแอปพลิเคชันเช่นตัวนับที่เพิ่มขึ้นแบบอะตอมและไม่สามารถใช้แทน Integer ได้ อย่างไรก็ตามคลาสนี้ขยาย Number เพื่ออนุญาตการเข้าถึงอย่างสม่ำเสมอโดยเครื่องมือและยูทิลิตีที่จัดการกับคลาสที่เป็นตัวเลข
เราสามารถใช้พวกเขาตามที่แสดง:
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]
จุดหนึ่งที่จะสังเกตเห็นก็คือเรามีการกล่าวอ้างget
ที่จะได้รับค่าสำหรับคีย์B
แล้วกล่าวอ้างเกี่ยวกับคุณค่าของมันซึ่งเป็นหลักสูตรincrementAndGet()
AtomicInteger
เราสามารถปรับให้เหมาะสมเนื่องจากเมธอดputIfAbsent
จะส่งคืนค่าสำหรับคีย์หากมีอยู่แล้ว:
map2.putIfAbsent("B",new AtomicInteger(0)).incrementAndGet();//[A=0, B=2]
ในหมายเหตุด้านถ้าเราวางแผนที่จะใช้AtomicLongแล้วตามเอกสารภายใต้การแข่งขันที่คาดหวังสูง throughput ของLongAdderจะสูงขึ้นอย่างมีนัยสำคัญค่าใช้จ่ายของการใช้พื้นที่ที่สูงขึ้น ตรวจสอบคำถามนี้ด้วย