1. ความแตกต่างระหว่าง HashMap และ Hashtable
ก่อนอื่นให้ดูคำจำกัดความของสองคลาส
Hashtable ระดับสาธารณะขยายพจนานุกรมใช้แผนที่, cloneable, java.io.serializable
HASHMAP ระดับสาธารณะขยายการใช้งาน AbstractMap ใช้แผนที่, cloneable, serializable
จะเห็นได้ว่า Hashtable สืบทอดมาจากพจนานุกรมและ HashMap สืบทอดมาจาก AbstractMap
วิธีการใส่แฮชแต้มมีดังนี้
การซิงโครไนซ์สาธารณะ V Put (k คีย์, ค่า v) {// ########### หมายเหตุที่นี่ 1 // ตรวจสอบให้แน่ใจว่าค่าไม่เป็นค่า null ถ้า (value == null) {// ####### หมายเหตุที่นี่ 2 โยน nullpointerexception ใหม่ (); } // ทำให้แน่ใจว่าคีย์ไม่ได้อยู่ในแฮช แท็บรายการ [] = ตาราง; int hash = key.hashCode (); // ######## หมายเหตุที่นี่ 3 int index = (แฮช & 0x7fffffff) tab.length; สำหรับ (รายการ e = tab [index]; e! = null; e = e.next) {ถ้า ((e.hash == hash) && e.key.equals (key)) {v old = e.value; e.value = ค่า; กลับมาเก่า; }} ModCount ++; if (count> = threshold) {// rehash ตารางถ้าเกณฑ์เกิน rehash (); tab = ตาราง; index = (แฮช & 0x7ffffff) % แท็บความยาว; } // สร้างรายการใหม่ รายการ e = แท็บ [ดัชนี]; แท็บ [ดัชนี] = รายการใหม่ (แฮช, คีย์, ค่า, e); นับ ++; คืนค่า null; - หมายเหตุ 1 วิธีการแบบซิงโครนัส
หมายเหตุ 2 วิธีไม่อนุญาตให้ค่า == null
หมายเหตุ 3 วิธีการเรียกใช้วิธี HashCode ของคีย์ ถ้า key == null ข้อยกเว้นตัวชี้ว่างจะถูกโยน วิธีการวางของ HashMap มีดังนี้
Public V Put (k key, v value) {// ########### note ที่นี่ 1 ถ้า (key == null) // ########## โปรดหมายเหตุที่นี่ 2 return putfornullkey (ค่า); int hash = hash (key.hashcode ()); int i = indexfor (แฮช, table.length); สำหรับ (รายการ e = ตาราง [i]; e! = null; e = e.next) {วัตถุ k; if (e.hash == hash && ((k = e.key) == key || key.equals (k))) {v oldValue = e.value; e.value = ค่า; E.RecordAccess (นี่); กลับ OldValue; }} ModCount ++; Addentry (แฮช, คีย์, ค่า, i); // ######## หมายเหตุที่นี่ส่งคืนค่า null; - หมายเหตุ 1 วิธีการแบบอะซิงโครนัส
หมายเหตุ 2 วิธีการอนุญาต key == null
หมายเหตุ 3 วิธีการไม่โทรไปยังค่าใด ๆ ดังนั้นจึงได้รับอนุญาตให้เป็นโมฆะ
เติมเต็ม:
Hashtable มีวิธีการบรรจุซึ่งสามารถทำให้เกิดความเข้าใจผิดได้อย่างง่ายดายดังนั้นจึงถูกลบออกใน HashMap
แน่นอนว่าทั้งสองคลาสใช้วิธีการของคีย์และการปรับค่า
| Hashmap | แฮช | |
| ชั้นเรียน | บทคัดย่อ | พจนานุกรม |
| มันซิงโครไนซ์หรือไม่ | เลขที่ | ใช่ |
| k, สามารถ v null | ใช่ | เลขที่ |
HashMap เป็นการใช้งานที่มีน้ำหนักเบาของ Hashtable (การใช้งานที่ไม่ปลอดภัยที่ไม่ปลอดภัย) พวกเขาทั้งหมดเสร็จสิ้นอินเตอร์เฟสแผนที่ ความแตกต่างที่สำคัญคือ HashMap อนุญาตให้คีย์ว่าง เนื่องจากไม่ปลอดภัยที่ไม่ปลอดภัยจึงอาจมีประสิทธิภาพมากกว่าแฮช
HashMap อนุญาตให้ NULL เป็นคีย์หรือค่าของรายการในขณะที่ Hashtable ไม่ได้
HashMap จะลบวิธีการ Hashtable ที่มีและเปลี่ยนแปลงไปสู่การปรับค่าและมีคีย์ เพราะวิธีการประกอบด้วยเป็นเรื่องง่ายที่จะทำให้เกิดความเข้าใจผิด
Hashtable สืบทอดมาจากคลาสพจนานุกรมและ HashMap เป็นการดำเนินการของอินเตอร์เฟส MAP ที่แนะนำโดย Java 1.2
ความแตกต่างที่ยิ่งใหญ่ที่สุดคือวิธีการแฮชช์ได้คือการซิงโครไนซ์ในขณะที่ HashMap ไม่ได้ เมื่อการเข้าถึงหลายเธรดการเข้าถึงแฮชท์พวกเขาไม่จำเป็นต้องซิงโครไนซ์สำหรับวิธีการของตัวเองและ HashMap จะต้องให้การซิงโครไนซ์ภายนอก (คอลเลกชัน SynchronizedMap)
อัลกอริธึมแฮช/การทำใหม่ที่ใช้โดย Hashtable และ HashMap นั้นมีความเหมือนกันดังนั้นจึงไม่มีความแตกต่างอย่างมากในการแสดง
สรุป:
ค่าคีย์ใน HashMap ได้รับอนุญาตให้ว่างเปล่าและเป็นแบบอะซิงโครนัส
ค่าคีย์ใน Hashtable ไม่ได้รับอนุญาตให้เป็นโมฆะและถูกซิงโครไนซ์
การสืบทอดแตกต่างกัน แต่ทั้งคู่ใช้อินเตอร์เฟสแผนที่
ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้ ฉันหวังว่ามันจะเป็นประโยชน์ต่อการเรียนรู้ของทุกคนและฉันหวังว่าทุกคนจะสนับสนุน wulin.com มากขึ้น