ตัววนซ้ำและการแจงนับทั้งคู่เป็นเคอร์เซอร์เพื่อสำรวจและเข้าถึงองค์ประกอบจากคอลเล็กชัน ทั้งคู่อยู่ในกรอบการรวบรวม เพิ่มการแจงนับใน JDK1.0 และ Iterator ในเวอร์ชัน JDK.1.2 ในเฟรมเวิร์กการรวบรวม
การแจงนับไม่สามารถเปลี่ยนแปลงโครงสร้างในคอลเล็กชันได้ เนื่องจากมีสิทธิ์เข้าถึงองค์ประกอบในคอลเล็กชันแบบอ่านอย่างเดียว โดยมีวิธีการดังนี้ :
- *hasMoreElements()
- *nextElement()
ในทางกลับกัน ตัววนซ้ำสามารถอ่านและลบองค์ประกอบในคอลเล็กชันได้ โดยมีวิธีการดังต่อไปนี้ -
- *hasNext()
- *next()
- *remove()
ซีเนียร์ เลขที่ | คีย์ | ตัววนซ้ำ | การแจงนับ |
---|---|---|---|
1 | พื้นฐาน | ใน Iterator เราสามารถอ่านและลบองค์ประกอบในขณะที่สำรวจองค์ประกอบในคอลเล็กชัน | การใช้การแจงนับ เราสามารถอ่านองค์ประกอบระหว่างการสำรวจองค์ประกอบในคอลเล็กชันเท่านั้น |
2. | การเข้าถึง | สามารถใช้ได้กับทุกคลาสของเฟรมเวิร์กคอลเล็กชัน | สามารถใช้ได้เฉพาะกับคลาสดั้งเดิมของเฟรมเวิร์กคอลเลกชัน เช่น Vector และ HashTable |
3. | Fail-Fast and Fail -Safe | การเปลี่ยนแปลงใดๆ ในคอลเล็กชัน เช่น การลบองค์ประกอบออกจากคอลเล็กชันระหว่างเธรดเป็นการวนซ้ำคอลเล็กชัน จากนั้นจะมีข้อยกเว้นการแก้ไขพร้อมกัน | การแจงนับนั้นล้มเหลวโดยธรรมชาติ ไม่ส่งข้อยกเว้นการดัดแปลงพร้อมกัน |
4. | ข้อจำกัด | เฉพาะการวนซ้ำทิศทางไปข้างหน้าเท่านั้น | การดำเนินการลบไม่สามารถทำได้โดยใช้การแจงนับ |
5. | วิธีการ | มีวิธีการดังต่อไปนี้ − *มีถัดไป() *ต่อไป() *ลบ() | มีวิธีการดังต่อไปนี้ − *มีองค์ประกอบเพิ่มเติม() * ถัดไปองค์ประกอบ () |
ตัวอย่างการแจงนับ
class EnumerationExample { public static void main(String args[]) { List list = new ArrayList(Arrays.asList( new String[] {"Apple", "Cat", "Dog", "Rat"})); Vector v = new Vector(list); delete(v, "Dog"); } private static void delete(Vector v, String name) { Enumeration e = v.elements(); while (e.hasMoreElements()) { String s = (String) e.nextElement(); if (s.equals(name)) { v.remove(name); } } // Display the names System.out.println("The names are:"); e = v.elements(); while (e.hasMoreElements()) { // Prints elements System.out.println(e.nextElement()); } } }
ตัวอย่างตัววนซ้ำ
class IteratorExample { public static void main(String args[]) { List list = new ArrayList(Arrays.asList( new String[] {"Apple", "Cat", "Dog", "Rat"})); Vector v = new Vector(list); delete(v, "Dog"); } private static void delete(Vector v, String name) { Iterator i = v.iterator(); while (i.hasNext()) { String s = (String) i.next(); if (s.equals(name)) { i.remove(); } } // Display the names System.out.println("The names are:"); i = v.iterator(); while (i.hasNext()) { System.out.println(i.next()); } } }