ทั้ง Iterator และ Enumeration เป็น cursor (เคอร์เซอร์) สำหรับการวนลูปและเข้าถึงองค์ประกอบจากคอลเลกชัน ทั้งคู่อยู่ใน Collection Framework Enumeration เพิ่มเข้ามาใน JDK 1.0 และ Iterator เพิ่มใน JDK 1.2
Enumeration ไม่สามารถทำการเปลี่ยนแปลงโครงสร้างคอลเลกชันได้ เพราะมีการเข้าถึงแบบ read-only เท่านั้น มีเมธอดดังนี้:
hasMoreElements()nextElement()
ส่ว Iterator สามารถอ่านและลบองค์ประกอบในคอลเลกชันได้ มีเมธอดดังนี้:
hasNext()next()remove()
ตารางเปรียบเทียบรายละเอียด
| ลำดับ | หัวข้อ | Iterator | Enumeration |
|---|---|---|---|
| 1 | พื้นฐาน | อ่านและลบองค์ประกอบขณะวนลูปได้ | อ่านองค์ประกอบขณะวนลูปได้อย่างเดียว |
| 2 | การเข้าถึง | ใช้กับทุกคลาสใน Collection Framework | ใช้กับ legacy classes เท่านั้น เช่น Vector, Hashtable |
| 3 | Fail-Fast / Fail-Safe | Fail-fast: โยน ConcurrentModificationException ถ้ามีการเปลี่ยนแปลงขณะวนลูป | Fail-safe: ไม่โยน ConcurrentModificationException |
| 4 | ข้อจำกัด | วนลูปได้เฉพาะทิศทางไปข้างหน้า (forward only) | ไม่สามารถทำ remove operation ได้ |
| 5 | เมธอด | hasNext(), next(), remove() | hasMoreElements(), nextElement() |
ตัวอย่าง Enumeration
Vector v = new Vector(Arrays.asList("Apple", "Cat", "Dog", "Rat"));
Enumeration e = v.elements();
while (e.hasMoreElements()) {
String s = (String) e.nextElement();
if (s.equals("Dog")) {
v.remove("Dog"); // อาจทำงานได้ แต่ไม่แนะนำ
}
}
ตัวอย่าง Iterator
Vector v = new Vector(Arrays.asList("Apple", "Cat", "Dog", "Rat"));
Iterator i = v.iterator();
while (i.hasNext()) {
String s = (String) i.next();
if (s.equals("Dog")) {
i.remove(); // วิธีที่ถูกต้อง
}
}
สรุป
Iterator เป็นเวอร์ชันใหม่กว่าและทรงพลังกว่า Enumeration รองรับการลบข้อมูลระหว่างวนลูป ใช้กับทุกคลาสคอลเลกชัน และเป็น fail-fast ช่วยตรวจจับข้อผิดพลาดได้ดีกว่า Enumeration เหลือใช้สำหรับ legacy code (Vector, Hashtable) เท่านั้น