คลาสแฮชเทเบิล
Hashtable สืบทอดอินเทอร์เฟซ Map และใช้ตารางแฮชของการแมปคีย์-ค่า วัตถุที่ไม่ใช่ null ใดๆ สามารถใช้เป็นคีย์หรือค่าได้
หากต้องการเพิ่มข้อมูล ให้ใช้ put(key,value) และหากต้องการลบข้อมูล ให้ใช้ get(key) ต้นทุนเวลาของการดำเนินการพื้นฐานทั้งสองนี้จะคงที่
Hashtable ปรับประสิทธิภาพผ่านพารามิเตอร์สองตัว: ความจุเริ่มต้นและปัจจัยโหลด โดยปกติแล้ว ค่าโหลดแฟกเตอร์เริ่มต้น 0.75 จะทำให้มีความสมดุลระหว่างเวลาและพื้นที่ดีขึ้น การเพิ่มตัวประกอบการโหลดสามารถประหยัดพื้นที่ได้ แต่เวลาในการค้นหาที่เกี่ยวข้องจะเพิ่มขึ้น ซึ่งจะส่งผลต่อการดำเนินการ เช่น การรับและการวาง
ตัวอย่างง่ายๆ ของการใช้ Hashtable มีดังนี้ ใส่ 1, 2 และ 3 ลงใน Hashtable และคีย์คือ "หนึ่ง", "สอง" และ "สาม" ตามลำดับ:
หมายเลข Hashtable = ใหม่ Hashtable();
Numbers.put("หนึ่ง", จำนวนเต็มใหม่ (1));
Numbers.put("สอง", จำนวนเต็มใหม่ (2));
Numbers.put("สาม", จำนวนเต็มใหม่ (3));
หากต้องการดึงข้อมูลตัวเลข เช่น 2 ให้ใช้คีย์ที่เกี่ยวข้อง:
จำนวนเต็ม n = (จำนวนเต็ม)numbers.get("สอง");
System.out.println("สอง = " + n);
เนื่องจากวัตถุที่ใช้เป็นคีย์จะกำหนดตำแหน่งของค่าที่สอดคล้องกันโดยการคำนวณฟังก์ชันแฮชของมัน วัตถุใดๆ ที่ใช้เป็นคีย์จะต้องใช้วิธี hashCode และเท่ากับ hashCode และเมธอดเท่ากับสืบทอดมาจากคลาสรูท Object หากคุณใช้คลาสแบบกำหนดเองเป็นคีย์ ให้ระวังให้มาก ตามคำจำกัดความของฟังก์ชันแฮช หากทั้งสองอ็อบเจ็กต์เหมือนกัน นั่นคือ obj1.equals( obj2)=true ดังนั้น hashCode ของพวกเขาจะต้องเหมือนกัน แต่ถ้าทั้งสองวัตถุแตกต่างกัน hashCode ของพวกเขาก็ไม่จำเป็นต้องแตกต่างกัน หาก hashCode ของสองวัตถุที่แตกต่างกันจะเหมือนกัน ปรากฏการณ์นี้เรียกว่าความขัดแย้ง ค่าใช้จ่ายในการดำเนินการตารางแฮชจะเพิ่มขึ้น ดังนั้นให้ลองกำหนดวิธีการ hashCode() ที่กำหนดไว้อย่างดีเพื่อเพิ่มความเร็วในการดำเนินการตารางแฮช
หากออบเจ็กต์เดียวกันมี hashCode ที่แตกต่างกัน การทำงานของตารางแฮชจะมีผลลัพธ์ที่ไม่คาดคิด (เมธอด get ที่คาดหวังจะส่งกลับค่า null) เพื่อหลีกเลี่ยงปัญหานี้ คุณจะต้องจำสิ่งเดียวเท่านั้น: แทนที่เมธอดเท่ากับและเมธอด hashCode พร้อมกัน เวลา อย่าเขียนเพียงหนึ่งในนั้น Hashtable เป็นแบบซิงโครนัส
คลาส HashMap
HashMap คล้ายกับ Hashtable ยกเว้นว่า HashMap เป็นแบบอะซิงโครนัสและอนุญาตให้มีค่า null นั่นคือค่า null และคีย์ null แต่เมื่อปฏิบัติต่อ HashMap เสมือนเป็นคอลเลกชั่น (เมธอด Values() สามารถส่งคืนคอลเลกชั่นได้) ค่าใช้จ่ายด้านเวลาของการดำเนินการย่อยของการวนซ้ำจะเป็นสัดส่วนกับความจุของ HashMap ดังนั้น หากประสิทธิภาพของการดำเนินการวนซ้ำมีความสำคัญมาก อย่าตั้งค่าความจุเริ่มต้นของ HashMap สูงเกินไปหรือปัจจัยโหลดต่ำเกินไป
คลาส WeakHashMap
WeakHashMap เป็น HashMap ที่ได้รับการปรับปรุงซึ่งใช้ "การอ้างอิงที่ไม่รัดกุม" กับคีย์ หากไม่มีการอ้างอิงคีย์จากภายนอกอีกต่อไป GC สามารถรีไซเคิลคีย์ได้
HashSet โปรดดูคำอธิบายของ Set
Set คือคอลเลกชันที่ไม่มีองค์ประกอบที่ซ้ำกัน กล่าวคือ สององค์ประกอบใดๆ e1 และ e2 มี e1.equals(e2)=false และ Set มีองค์ประกอบ null มากสุดหนึ่งองค์ประกอบ
ตัวสร้างของชุดมีข้อจำกัดว่าพารามิเตอร์คอลเลกชันที่ส่งผ่านต้องไม่มีองค์ประกอบที่ซ้ำกัน
โปรดทราบ: วัตถุที่ไม่แน่นอนจะต้องได้รับการจัดการด้วยความระมัดระวัง หากองค์ประกอบที่ไม่แน่นอนในชุดเปลี่ยนสถานะทำให้เกิด Object.equals(Object)=true ก็จะทำให้เกิดปัญหาบางอย่าง
การใช้งาน Set ทั่วไปสองแบบคือ HashSet และ TreeSet การตัดสินใจว่าจะใช้อันไหนค่อนข้างตรงไปตรงมา HashSet เร็วกว่ามาก (เวลาคงที่เทียบกับเวลาบันทึกสำหรับการดำเนินการส่วนใหญ่) แต่ไม่มีการรับประกันการสั่งซื้อ หากคุณต้องการใช้การดำเนินการใน SortedSet หรือหากการวนซ้ำตามลำดับมีความสำคัญต่อคุณ ให้ใช้ TreeSet มิฉะนั้น ให้ใช้ HashSet เป็นการพนันที่ยุติธรรมสำหรับคุณที่จะไม่ใช้ HashSet เป็นส่วนใหญ่
สิ่งหนึ่งที่คุณควรคำนึงถึงเกี่ยวกับ HashSets ก็คือ การวนซ้ำจะเป็นเส้นตรงในแง่ของผลรวมของจำนวนรายการและความจุ ดังนั้นหากประสิทธิภาพการวนซ้ำมีความสำคัญ ควรเลือกความจุเริ่มต้นที่เหมาะสมอย่างระมัดระวัง การเลือกความจุที่มากเกินไปทำให้สิ้นเปลืองทั้งพื้นที่และเวลา ความจุเริ่มต้นเริ่มต้นคือ 101 ซึ่งโดยทั่วไปมากกว่าที่คุณต้องการ คุณสามารถใช้ int Constructor เพื่อระบุความจุเริ่มต้น ความจุเริ่มต้นของ HashSet ที่จะจัดสรรคือ 17:
ตั้ง s= ใหม่ HashSet(17);
HashSets ยังมี "พารามิเตอร์การปรับแต่ง" ที่เรียกว่าตัวประกอบการโหลด หากคุณกังวลอย่างมากเกี่ยวกับการใช้พื้นที่ของ HashSet โปรดอ่านข้อความ HashSet เพื่อดูรายละเอียด มิฉะนั้น เพียงใช้ค่าเริ่มต้น หากคุณยอมรับปัจจัยการโหลดเริ่มต้น แต่คุณต้องการระบุกำลังการผลิตเริ่มต้น ให้เลือกตัวเลขที่ประมาณสองเท่าของกำลังการผลิตที่คุณคาดหวังให้ชุดของคุณเพิ่มขึ้น หากคุณคาดเดาผิดไป มันสามารถเติบโตได้หรือเปลืองพื้นที่เพียงเล็กน้อย แต่ไม่มีปัญหาใหญ่ หากคุณทราบค่าที่ดีที่สุดสำหรับขนาดที่ถูกต้อง ให้ใช้ค่านั้น หากคุณไม่ทราบ ให้ใช้ค่าเก่า หรือใช้ค่าคู่ มันไม่สำคัญมากจริงๆ สิ่งเหล่านี้ทำให้ HashSet ดีขึ้นเล็กน้อยเท่านั้น
TreeSet ไม่มีพารามิเตอร์การปรับแต่ง นอกจากการโคลนแล้ว HashSet และ TreeSet ยังมีเฉพาะการดำเนินการที่จำเป็นสำหรับอินเทอร์เฟซที่เกี่ยวข้อง (Set และ TreeSet) และไม่มีการดำเนินการอื่นใด