การแจงนับเทียบกับตัววนซ้ำ
มีโครงสร้างข้อมูลจำนวนมากที่ทำหน้าที่เป็นคอลเล็กชันใน Java เช่น Vectors, Hash tables และคลาสที่ใช้ Java Collections Framework (เช่น HashMap, HashSet, ArrayList, TreeSet, TreeMap, LinkedList, LinkedHashMap และ LinkedHashSet) มีหลายวิธีในการวนซ้ำแต่ละองค์ประกอบของอ็อบเจ็กต์ใน Java Java มีอินเทอร์เฟซสองแบบเพื่อทำให้งานนี้ง่ายขึ้น การแจงนับและตัววนซ้ำเป็นสองอินเทอร์เฟซที่พบในแพ็คเกจ java.util ที่มีฟังก์ชันในการแจกแจงลำดับหรืออ็อบเจ็กต์ด้วยชุดของไอเท็ม ตัวแจงนับถูกนำมาใช้ใน JDK 10 และ Iterator ที่นำมาใช้ใน JDK 1.2 แทบจะทำซ้ำการทำงานของ Enumerator (ภายใน Collections Framework)
การแจงนับคืออะไร
การแจกแจงเป็นอินเทอร์เฟซสาธารณะใน Java เปิดตัวใน JDK 1.0 ซึ่งให้ความสามารถในการแจกแจงผ่านลำดับขององค์ประกอบ อยู่ภายใต้แพ็คเกจ java.util เมื่อใช้งานอินเทอร์เฟซการแจงนับโดยวัตถุ วัตถุนั้นสามารถสร้างลำดับขององค์ประกอบได้ อินเทอร์เฟซการแจงนับมีสองวิธี เมธอด hasMoreElements() จะทดสอบว่าการแจงนับนี้มีองค์ประกอบมากกว่านี้หรือไม่ และ nextElement() จะส่งกลับองค์ประกอบถัดไปในลำดับ (หากมีอีกอย่างน้อยหนึ่งรายการ) กล่าวอีกนัยหนึ่ง โดยเรียก nextElement() ตามลำดับ โปรแกรมเมอร์สามารถเข้าถึงแต่ละองค์ประกอบในซีรีส์ได้ ตัวอย่างเช่น ในการพิมพ์องค์ประกอบทั้งหมดใน Vector v1 โดยใช้ Enumerator คุณสามารถใช้ข้อมูลโค้ดต่อไปนี้ได้
การแจงนับ e=v1.elements();
ในขณะที่(e.hasMoreLements()){
System.out.println(e.nextElement());
}
Enumerator ยังสามารถใช้เพื่อกำหนดสตรีมของอินพุตไปยังออบเจ็กต์ SequenceInputStream
ตัววนซ้ำคืออะไร
Iterator เป็นอินเทอร์เฟซสาธารณะในแพ็คเกจ Java.util ซึ่งอนุญาตให้ทำซ้ำผ่านองค์ประกอบของวัตถุคอลเลกชันที่ใช้กรอบงานคอลเลกชัน (เช่น ArrayList, LinkedList เป็นต้น) สิ่งนี้ถูกนำมาใช้ใน JDK 1.2 และแทนที่ Enumerator ภายใน Java Collections Framework Iterator มีสามวิธี เมธอด hasNext() จะทดสอบว่ามีองค์ประกอบที่เหลืออยู่ในคอลเล็กชันหรือไม่ และเมธอด next() จะคืนค่าองค์ประกอบถัดไปในซีรีส์ สามารถใช้เมธอด remove() เพื่อลบองค์ประกอบปัจจุบันออกจากคอลเล็กชันพื้นฐาน ตัวอย่างเช่น ในการพิมพ์องค์ประกอบทั้งหมดใน Vector v1 โดยใช้ Iterator คุณสามารถใช้ข้อมูลโค้ดต่อไปนี้ได้
Iterator i=v1.elements();
ในขณะที่(i.hasNext()){
System.out.println(e.next());
}
การแจงนับและการวนซ้ำต่างกันอย่างไร
แม้ว่าการแจงนับและตัววนซ้ำเป็นสองอินเทอร์เฟซที่พบในแพ็คเกจ java.util ซึ่งอนุญาตให้วนซ้ำ/แจงนับผ่านองค์ประกอบของชุดข้อมูล พวกมันมีความแตกต่างกัน อันที่จริง Iterator ซึ่งเปิดตัวหลังจากการแจงนับ แทนที่การแจงนับภายในเฟรมเวิร์ก Java Collections Iterator ไม่เหมือนกับการแจงนับ ซึ่งหมายความว่าไม่อนุญาตให้ทำการแก้ไขพร้อมกัน (กับคอลเล็กชันพื้นฐาน) เมื่อใช้ Iterator สิ่งนี้มีประโยชน์มากในสภาพแวดล้อมแบบมัลติเธรดที่มีความเสี่ยงของการแก้ไขพร้อมกันเสมอ ในกรณีของการแก้ไขพร้อมกัน ออบเจ็กต์ Iterator จะส่ง ConcurrentModificationException Iterator มีชื่อวิธีที่สั้นกว่าเมื่อเปรียบเทียบกับ Enumerator นอกจากนี้ iterator ยังมีฟังก์ชันเพิ่มเติมของการลบองค์ประกอบในระหว่างการวนซ้ำ (ซึ่งไม่สามารถทำได้โดยใช้ Enumerator)ดังนั้น หากจำเป็นต้องลบองค์ประกอบออกจากคอลเล็กชัน Iterator เป็นตัวเลือกเดียวที่สามารถพิจารณาได้