การอัปเดตค่าใน HashMap
HashMap<K, V> ใช้ put(key, value) สำหรับทั้ง เพิ่มใหม่ และ อัปเดตค่าที่มีอยู่ - หาก Key มีอยู่แล้ว จะแทนที่ค่าเก่า
ขั้นตอนการอัปเดต
- ดึงค่าเก่าด้วย
get(key) - คำนวณ/เปลี่ยนแปลงค่า
- put กลับด้วย Key เดียวกัน
ตัวอย่างที่ 1: ใน main โดยตรง
import java.util.HashMap;
public class Demo {
public static void main(String[] args) {
System.out.println("The required packages have been imported");
HashMap inputMap = new HashMap<>();
inputMap.put("Java", 1);
inputMap.put("Scala", 2);
inputMap.put("Python", 3);
System.out.println("The HashMap is defined as: " + inputMap);
// 1. ดึงค่าเก่า
int value = inputMap.get("Scala");
// 2. คำนวณค่าใหม่ (บวก 10)
value = value + 10;
// 3. Put กลับ (อัปเดต)
inputMap.put("Scala", value);
System.out.println("\nThe HashMap with the updated value is: " + inputMap);
}
}
ผลลัพธ์
The required packages have been imported
The HashMap is defined as: {Java=1, Scala=2, Python=3}
The HashMap with the updated value is: {Java=1, Scala=12, Python=3}
ตัวอย่างที่ 2: แยกเป็นเมธอด (OOP)
import java.util.HashMap;
class Demo {
static void update(HashMap inputMap, String updateKey) {
int value = inputMap.get(updateKey);
value = value + 10;
inputMap.put(updateKey, value);
System.out.println("\nThe HashMap with the updated value is: " + inputMap);
}
public static void main(String[] args) {
System.out.println("The required packages have been imported");
HashMap inputMap = new HashMap<>();
inputMap.put("Java", 1);
inputMap.put("Scala", 2);
inputMap.put("Python", 3);
System.out.println("The HashMap is defined as: " + inputMap);
String updateString = "Scala";
update(inputMap, updateString);
}
}
เมธอดสำหรับอัปเดตที่ทันสมัยกว่า (Java 8+)
1. compute() - คำนวณจากค่าเก่า
// อัปเดตโดยใช้ค่าเก่า
map.compute("Scala", (k, v) -> v == null ? 10 : v + 10);
// ถ้า Key ไม่มีอยู่ จะสร้างใหม่ด้วยค่าที่คำนวณได้
2. computeIfPresent() - อัปเดตเฉพาะ Key ที่มีอยู่
// อัปเดตเฉพาะถ้ามี Key นี้อยู่แล้ว
map.computeIfPresent("Scala", (k, v) -> v + 10);
// ถ้าไม่มี Key "Scala" จะไม่ทำอะไร (ไม่สร้างใหม่)
3. merge() - รวมค่าเก่าและค่าใหม่
// ใช้เมื่อต้องการ merge ค่า (เช่น นับความถี่)
map.merge("Scala", 10, (oldVal, newVal) -> oldVal + newVal);
// เทียบเท่า: put(key, oldVal + newVal) ถ้ามี key, put(key, newVal) ถ้าไม่มี
4. replace() - แทนที่ค่า (เฉพาะ Key ที่มีอยู่)
// แทนที่ค่าเก่าด้วยค่าใหม่ (ต้องมี Key อยู่แล้ว)
map.replace("Scala", 12); // คืน true ถ้าสำเร็จ
// แทนที่ก็ต่อเมื่อค่าเก่าเท่ากับที่ระบุ
map.replace("Scala", 2, 12); // คืน true ถ้าค่าเก่าเป็น 2
การจัดการ Key ที่ไม่มีอยู่
// ปัญหา: get() คืน null → NullPointerException ตอนคำนวณ
int value = map.get("NonExistent"); // null
value = value + 10; // NPE!
// แก้: ใช้ getOrDefault()
int value = map.getOrDefault("Scala", 0) + 10;
map.put("Scala", value);
// หรือ Java 8+ compute()
map.compute("Scala", (k, v) -> (v == null ? 0 : v) + 10);
Thread Safety (ConcurrentHashMap)
ใน Multi-threaded Environment ใช้ ConcurrentHashMap:
ConcurrentHashMap map = new ConcurrentHashMap<>();
map.put("Scala", 2);
// Atomic update
map.compute("Scala", (k, v) -> v == null ? 10 : v + 10);
// หรือใช้ LongAdder สำหรับ Counter
ConcurrentHashMap counters = new ConcurrentHashMap<>();
counters.computeIfAbsent("Scala", k -> new LongAdder()).increment();
สรุป
put(key, newValue)ใช้สำหรับทั้ง Insert และ Update- Pattern แบบคลาสสิก:
get → compute → put - Java 8+: ใช้
compute(),computeIfPresent(),merge(),replace() - ระวัง NullPointerException ใช้
getOrDefault()หรือcompute() - Multi-thread: ใช้
ConcurrentHashMap+ atomic methods