อะไรคือความแตกต่างที่แน่นอนระหว่างสองอินเทอร์เฟซนี้? ไม่Enumeration
มีประโยชน์มากกว่าการใช้Iterator
? หากใครสามารถอธิบายได้อย่างละเอียดบทความอ้างอิงจะได้รับการชื่นชม
อะไรคือความแตกต่างที่แน่นอนระหว่างสองอินเทอร์เฟซนี้? ไม่Enumeration
มีประโยชน์มากกว่าการใช้Iterator
? หากใครสามารถอธิบายได้อย่างละเอียดบทความอ้างอิงจะได้รับการชื่นชม
คำตอบ:
ดูข้อกำหนด Java API สำหรับIterator
อินเทอร์เฟซมีคำอธิบายเกี่ยวกับความแตกต่างระหว่างEnumeration
:
ตัวทำซ้ำแตกต่างจากการแจงนับในสองวิธี:
- ตัวทำซ้ำอนุญาตให้ผู้เรียกลบองค์ประกอบออกจากคอลเลกชันที่อยู่เบื้องหลังระหว่างการวนซ้ำด้วยความหมายที่กำหนดไว้อย่างดี
- ปรับปรุงชื่อเมธอดแล้ว
บรรทัดล่างคือทั้งสองอย่างEnumeration
และIterator
จะให้องค์ประกอบที่ต่อเนื่องกัน แต่Iterator
ได้รับการปรับปรุงในลักษณะนี้ดังนั้นชื่อวิธีการจึงสั้นลงและมีremove
วิธีการเพิ่มเติม นี่คือการเปรียบเทียบแบบเคียงข้างกัน:
Enumeration Iterator
---------------- ----------------
hasMoreElement() hasNext()
nextElement() next()
N/A remove()
ตามที่กล่าวไว้ในข้อกำหนด Java API สำหรับโปรแกรมใหม่ ๆIterator
ควรเป็นที่ต้องการมากกว่าEnumeration
เนื่องจาก "Iterator ใช้แทน Enumeration ในกรอบงานคอลเลกชัน Java" (จากIterator
ข้อมูลจำเพาะ)
Iterators จะล้มเหลวได้อย่างรวดเร็ว เช่นเมื่อหนึ่งในหัวข้อการเปลี่ยนแปลงการเก็บรวบรวมจากการดำเนินงานเพิ่ม / ลบในขณะที่หัวข้ออื่น traversing มันผ่าน Iterator โดยใช้hasNext() or next()
วิธี iterator ConcurrentModificationException
ล้มเหลวได้อย่างรวดเร็วโดยการขว้างปา พฤติกรรมที่ล้มเหลวอย่างรวดเร็วของตัวทำซ้ำสามารถใช้เพื่อตรวจหาจุดบกพร่องเท่านั้น การแจงนับที่ส่งคืนโดยวิธีการของคลาสเช่น Hashtable, Vector ไม่ใช่การทำงานอย่างรวดเร็วที่ทำได้โดยการซิงโครไนซ์บล็อกของโค้ดภายในnextElement()
วิธีการที่ล็อกอ็อบเจ็กต์ Vector ปัจจุบันซึ่งใช้เวลามาก
"อย่างเป็นทางการ" ซึ่งควรจะคล้ายกับอินเทอร์เฟซตัววนซ้ำที่รองรับการดำเนินการเพิ่มเติม (เช่นการลบ) โดยทั่วไปมีแนวโน้มที่จะใช้ตัวทำซ้ำ
นี่คือจากjavadocs อินเทอร์เฟซการแจงนับ :
หมายเหตุ: การทำงานของอินเทอร์เฟซนี้ซ้ำกันโดยอินเทอร์เฟซ Iterator นอกจากนี้ Iterator ยังเพิ่มการดำเนินการลบที่เป็นทางเลือกและมีชื่อวิธีการที่สั้นกว่า การใช้งานใหม่ควรพิจารณาใช้ Iterator ตามความต้องการของ Enumeration
ข้อเท็จจริงง่ายๆอย่างหนึ่ง แต่ไม่ได้กล่าวถึงในคำตอบก่อนหน้านี้Iterator<T>
คือใช้Iterable<T>
เพื่อทำหน้าที่ในการตีความfor(_type_ element:collection){...}
โครงสร้าง
มีความแตกต่างพื้นฐานสามประการในการแจงนับและตัวทำซ้ำ
การแจงนับ
1. ใช้สำหรับคลาส lagacy เท่านั้น (เช่นVector
)
Enumeration e = v.elements();
v is the object of `Vector` class
2. สามารถดำเนินการอ่านได้เราไม่สามารถลบองค์ประกอบได้
3. มีสองวิธี
iterator
ใช้ได้กับคอลเลคชันทั้งหมด
Iterator itr = c.iterator();
where c is any `Collection` class
สามารถดำเนินการอ่านและลบได้
มีสามวิธี
ข้อ จำกัดในทั้งสองอย่าง
Add object
และReplace object
หากคุณกำลังเขียนคลาสคอลเลกชันของคุณเองและคุณกำลังขยายคลาสที่มีอยู่หรือใช้อินเทอร์เฟซกรอบงานคอลเลคชันใด ๆ โดยพื้นฐานแล้วคุณจะไม่มีทางเลือกอื่นนอกจากใช้ Iterator
หากมีเหตุผลบางคน (ที่ผมไม่สามารถคิด) คุณกำลังสร้างชั้นคอลเลกชันที่กำหนดเองที่ไม่เกี่ยวข้องกับ java.util.Collection หรือ java.util.Map ในทางใด ๆ ที่คุณควรจะยังคงดำเนินการ Iterable เพื่อให้ประชาชนสามารถใช้ ชั้นเรียนของคุณสำหรับลูป
ข้อแตกต่างที่สำคัญคือการแจงนับไม่แสดงวิธีลบ () ยิ่งไปกว่านั้น Iterator ไม่อนุญาตการนำทางพร้อมกันและการแก้ไขบนวัตถุที่อยู่เบื้องหลัง พวกเขามีการควบคุมเพื่อดูว่ามีการแก้ไขพร้อมกันหรือไม่และด้วยเหตุนี้จึงต้องใช้การประมวลผลมากขึ้น ดังนั้นประสิทธิภาพของ Enumeration จึงเร็วกว่า Iterator เกือบ 50% หากเราต้องการเพียงการนำทางโดยไม่สนใจการซิงโครไนซ์ดังกล่าวให้ใช้การแจงนับ
1) ความแตกต่างที่สำคัญระหว่าง Iterator และ Enumeration คือการนำองค์ประกอบออกในขณะที่ข้ามคอลเลกชัน Iterator สามารถลบองค์ประกอบในระหว่างการข้ามคอลเลกชันได้เนื่องจากมีวิธีการลบ () การแจงนับไม่มีวิธีลบ ()
2) การแจงนับไม่ปลอดภัยโดยธรรมชาติ จะไม่โยน ConcurrentModificationException หากคอลเลกชันถูกแก้ไขในระหว่างการส่งผ่าน Iterator นั้นล้มเหลวอย่างรวดเร็วโดยธรรมชาติ มันพ่น ConcurrentModificationException หากคอลเลกชันถูกแก้ไขในขณะที่ทำซ้ำวิธีอื่นที่ไม่ใช่เมธอด remove () ของตัวเอง
3) การแจงนับเป็นอินเทอร์เฟซแบบเดิมที่ใช้สำหรับการข้ามผ่าน Vector, Hashtable Iterator ไม่ใช่อินเทอร์เฟซเดิม Iterator สามารถใช้สำหรับการข้ามผ่านของ HashMap, LinkedList, ArrayList, HashSet, TreeMap, TreeSet
การแจงนับสามารถใช้ได้กับคลาสเดิมเท่านั้น (Vector, Stack ... ) ในขณะที่ Iterator สามารถใช้ได้กับทุกคน
ใช้ทั้งตัววนซ้ำและการแจงนับเพื่อดึงข้อมูลความแตกต่างคือการแจงนับสามารถใช้ได้เฉพาะกับคลาสเดิมเช่นเวกเตอร์ / สแต็กในขณะที่ตัววนซ้ำสามารถใช้สำหรับส่วนที่เหลือได้ นอกจากนี้ยังสามารถใช้การแจงนับสำหรับชุดคีย์ในแผนที่