ตัววนซ้ำและการแจงนับทั้งคู่เป็นเคอร์เซอร์เพื่อสำรวจและเข้าถึงองค์ประกอบจากคอลเล็กชัน ทั้งคู่อยู่ในกรอบการรวบรวม เพิ่มการแจงนับใน 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());
}
}
}