การวนลูป (Iterate) ผ่าน HashMap ใน Java
HashMap เก็บข้อมูลเป็นคู่ Key-Value การวนลูปสามารถทำได้หลายวิธี ขึ้นอยู่กับว่าต้องการ Key, Value หรือทั้งคู่
วิธีการวนลูปหลัก
1. ใช้ entrySet() - แนะนำสำหรับ Key + Value
Map map = new HashMap<>();
map.put("1", "Java");
map.put("2", "Python");
for (Map.Entry entry : map.entrySet()) {
System.out.println(entry.getKey() + " : " + entry.getValue());
}
2. ใช้ keySet() - เมื่อต้องการแค่ Key
for (String key : map.keySet()) {
System.out.println("Key: " + key + ", Value: " + map.get(key));
}
3. ใช้ values() - เมื่อต้องการแค่ Value
for (String value : map.values()) {
System.out.println(value);
}
4. ใช้ forEach (Java 8+) - Lambda Style
map.forEach((key, value) -> System.out.println(key + " : " + value));
5. ใช้ Iterator (สำหรับลบขณะวนลูป)
Iterator> iterator = map.entrySet().iterator();
while (iterator.hasNext()) {
Map.Entry entry = iterator.next();
if (entry.getValue().equals("Python")) {
iterator.remove(); // ลบได้อย่างปลอดภัย
}
}
ตัวอย่างโค้ดสมบูรณ์
import java.util.HashMap;
import java.util.Map;
public class Demo {
public static void main(String[] args) {
Map inputMap = new HashMap<>();
inputMap.put("1", "Java");
inputMap.put("2", "Python");
inputMap.put("3", "Scala");
inputMap.put("4", "Javascript");
System.out.println("องค์ประกอบของ HashMap:");
// วิธีที่ 1: entrySet (แนะนำ)
for (Map.Entry entry : inputMap.entrySet()) {
System.out.println(entry.getKey() + " : " + entry.getValue());
}
System.out.println("\n--- ใช้ forEach (Java 8+) ---");
inputMap.forEach((k, v) -> System.out.println(k + " : " + v));
}
}
ผลลัพธ์
องค์ประกอบของ HashMap:
1 : Java
2 : Python
3 : Scala
4 : Javascript
--- ใช้ forEach (Java 8+) ---
1 : Java
2 : Python
3 : Scala
4 : Javascript
ประสิทธิภาพและคำแนะนำ
| วิธี | ประสิทธิภาพ | เหมาะสำหรับ |
|---|---|---|
| entrySet() | ดีที่สุด | ต้องการทั้ง Key และ Value |
| keySet() + get() | ช้ากว่า (lookup ซ้ำ) | ต้องการแค่ Key |
| values() | ดี | ต้องการแค่ Value |
| forEach() | ดี | Code สั้น กระชับ (Java 8+) |
ข้อควรระวัง
- HashMap ไม่รับประกันลำดับ ใช้
LinkedHashMapหากต้องการรักษาลำดับการแทรก - การแก้ไข Map ขณะวนลูป (put/remove) จะโยน
ConcurrentModificationException→ ใช้ Iterator หรือเก็บ key ที่จะลบไว้ก่อน - Key ที่เป็น
nullได้เพียงคีย์เดียว (Value เป็น null ได้หลายค่า)