คำนำ
ในตัวอย่างโค้ดของการวิเคราะห์พูลการเชื่อมต่อฐานข้อมูล คุณจะเห็นว่ามีการใช้การแจงนับเพื่อสำรวจคอลเลกชัน Vector ต่อมา ฉันค้นหาข้อมูลบางอย่างเพื่อดูว่าสามารถใช้วิธีใดในการสำรวจคลาสการรวบรวม ฉันพบตัวอย่างต่อไปนี้บนอินเทอร์เน็ตเกี่ยวกับการใช้ Enumeration และ Iterator เพื่อสำรวจคลาสการรวบรวม อย่างไรก็ตาม ตัวอย่างนี้ระบุว่าการแจงนับมีประสิทธิภาพมากกว่า Iterator จริงๆ แล้ว นี่ไม่ใช่กรณี การทดสอบเวลาในตัวอย่างนี้เป็นแบบด้านเดียวเกินไปเนื่องจากปริมาณข้อมูลน้อยเกินไป เมื่อจำนวนข้อมูลเพิ่มขึ้น ประสิทธิภาพระหว่างทั้งสองก็จะใกล้เข้ามามากขึ้นเรื่อยๆ โดยไม่มีอัตราส่วนของจำนวนทวีคูณปรากฏขึ้น ยิ่งไปกว่านั้น ปัจจุบัน Iterator ถูกใช้โดยทั่วไปเพื่อสำรวจคลาสคอลเลกชัน เฉพาะผู้ที่ประกาศโดยเฉพาะว่าต้องใช้การแจงนับเท่านั้นที่จะใช้คลาสนี้เพื่อสำรวจคอลเลกชัน
ตัวอย่างโค้ด
คัดลอกรหัสรหัส ดังต่อไปนี้:
แพ็คเกจ edu.sjtu.erplab.hash;
นำเข้า java.util.Enumeration;
นำเข้า java.util.Hashtable;
นำเข้า java.util.Iterator;
นำเข้า java.util.Map.Entry;
//อินสแตนซ์แฮชแบบสำรวจเส้นทาง
TraveseHashTable คลาสสาธารณะ {
โมฆะคงที่สาธารณะ main (String [] args) {
// เริ่มต้นและสร้าง hashtable
Hashtable<String, String> ht = ใหม่ Hashtable<String, String>();
สำหรับ (int i = 0; i < 10,000; i++) {
ht.put("Key=" + i, "Val=" + i);
-
// 1. ใช้การแจงนับ
เริ่มต้นนาน = System.currentTimeMillis();
การแจงนับ<String> en = ht.keys();//ใช้การแจงนับเพื่อรับรหัส
ในขณะที่ (en.hasMoreElements()) {
en.nextElement();
-
ปลายยาว = System.currentTimeMillis();
System.out.println("ต้นทุนคีย์การแจงนับ" + (สิ้นสุด - เริ่มต้น)
+ " มิลลิวินาที");
// 2. ใช้การแจงนับ
เริ่มต้น = System.currentTimeMillis();
การแจงนับ<String> en2 = ht.elements();//ใช้การแจงนับเพื่อรับคู่คีย์-ค่านี้
ในขณะที่ (en2.hasMoreElements()) {
en2.nextElement();
-
สิ้นสุด = System.currentTimeMillis();
System.out.println("ต้นทุนองค์ประกอบการแจงนับ" + (สิ้นสุด - เริ่มต้น)
+ " มิลลิวินาที");
// 3. ตัววนซ้ำ
เริ่มต้น = System.currentTimeMillis();
Iterator<String> it = ht.keySet().iterator();//ใช้ตัววนซ้ำเพื่อรับคีย์นี้
ในขณะที่ (it.hasNext()) {
it.ถัดไป();
-
สิ้นสุด = System.currentTimeMillis();
System.out.println("ต้นทุนชุดคีย์ตัววนซ้ำ" + (สิ้นสุด - เริ่มต้น)
+ " มิลลิวินาที");
// 4. ตัววนซ้ำ
เริ่มต้น = System.currentTimeMillis();
Iterator<Entry<String, String>> it2 = ht.entrySet().iterator();//ใช้ตัววนซ้ำเพื่อรับคู่คีย์-ค่านี้
ในขณะที่ (it2.hasNext()) {
it2.ถัดไป();
-
สิ้นสุด = System.currentTimeMillis();
System.out.println("ตัววนซ้ำรายการตั้งค่าต้นทุน" + (สิ้นสุด - เริ่มต้น)
+ " มิลลิวินาที");
-
-
อินเทอร์เฟซที่เลิกใช้แล้ว: การแจงนับ
อินเทอร์เฟซการแจงนับถูกนำมาใช้ใน JDK 1.0 และเป็นอินเทอร์เฟซเอาต์พุตการวนซ้ำที่ดีที่สุด เมื่อใช้ Vector ครั้งแรก (แนะนำให้ใช้ ArrayList) อินเทอร์เฟซการแจงนับถูกใช้สำหรับเอาต์พุต แม้ว่าการแจงนับจะเป็นคลาสเก่า แต่คลาสการแจงนับก็ถูกขยายหลังจาก JDK1.5 เพื่อเพิ่มแอปพลิเคชันการดำเนินการทั่วไป
วิธีการที่ใช้กันทั่วไปของอินเทอร์เฟซการแจงนับ ได้แก่ hasMoreElements() (เพื่อตรวจสอบว่ามีค่าถัดไปหรือไม่) และ nextElement() (เพื่อลบองค์ประกอบปัจจุบัน) ฟังก์ชันของวิธีการเหล่านี้คล้ายกับ Iterator ยกเว้นว่ามีวิธีการ ลบข้อมูลใน Iterator แต่อินเทอร์เฟซนี้ไม่มีการดำเนินการลบ
เหตุใดจึงยังใช้อินเทอร์เฟซการแจงนับต่อไป
อินเทอร์เฟซการแจงนับและตัววนซ้ำมีฟังก์ชันที่คล้ายกัน และตัววนซ้ำมีฟังก์ชันมากกว่าการแจงนับ ดังนั้นเหตุใดจึงต้องใช้การแจงนับ นี่เป็นเพราะว่าการพัฒนา Java ได้ผ่านช่วงเวลาที่ยาวนาน และระบบหรือเมธอดเก่าบางระบบในคลาสไลบรารียังคงใช้อินเทอร์เฟซการแจงนับ ดังนั้น เพื่อความเข้ากันได้ การแจงนับยังคงต้องใช้
คลาสย่อยทั่วไปของอินเทอร์เฟซรายการ
คลาสย่อยที่ใช้กันทั่วไปของอินเทอร์เฟซรายการ ได้แก่ ArrayList และ Vector ทั้งสองมีความคล้ายคลึงกันมาก การเปรียบเทียบระหว่างทั้งสองมีดังต่อไปนี้