Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Java

ความแตกต่างระหว่าง Iterator และ Enumeration ใน Java

ทั้ง 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) เท่านั้น