คลาส Java Hashtableเป็นหนึ่งในสมาชิกที่เก่าแก่ที่สุดของ Java Collection Framework เป็นการดำเนินการตามโครงสร้างข้อมูลตารางแฮชทางคณิตศาสตร์ ใน Java hashtable ภายในประกอบด้วยบัคเก็ตที่เก็บคู่คีย์/ค่า Hashtableค่อนข้างคล้ายกับHashMap ความแตกต่างที่สำคัญที่สุดระหว่างพวกเขา: Hashtableถูกซิงโครไนซ์ในขณะที่HashMapไม่ใช่
Hashtable เป็นโครงสร้างข้อมูล
Hashtableเป็นโครงสร้างข้อมูลที่เก็บข้อมูลในรูปแบบอาร์เรย์ ค่าข้อมูลทุกค่ามีค่าคีย์ที่ไม่ซ้ำกัน หากทราบคีย์ การเข้าถึงข้อมูลที่ต้องการจะรวดเร็วมาก ดังนั้น การแทรกและการค้นหาจึงรวดเร็วโดยไม่ขึ้นกับขนาดข้อมูล ตารางแฮชประกอบด้วยอาร์เรย์เพื่อเก็บข้อมูลและแฮชสำหรับสร้างดัชนีที่องค์ประกอบควรอยู่ การแฮชคืออะไร? เป็นกฎที่แมปวัตถุเป็นชุดอักขระ (รหัส) โดยปกติแล้วฟังก์ชันประเภทนี้จะแปลงข้อมูลขนาดใหญ่ให้เป็นค่าจำนวนเต็มขนาดเล็ก ฟังก์ชันแฮชอาจแตกต่างกัน แต่ทั้งหมดมีคุณสมบัติบางอย่าง:- วัตถุเฉพาะมีรหัสแฮชเฉพาะ
- อ็อบเจกต์สองตัวที่เท่ากันมีรหัสแฮชเหมือนกัน สิ่งที่ตรงกันข้ามไม่เป็นความจริง
- หากรหัสแฮชสองรหัสต่างกัน แสดงว่าวัตถุนั้นไม่เท่ากันอย่างแน่นอน
- วัตถุที่แตกต่างกันอาจมีรหัสแฮชเดียวกัน เหตุการณ์ที่หายากมากนี้เรียกว่าการปะทะกัน ฟังก์ชันแฮชที่ดีช่วยลดความน่าจะเป็นของการชนกันให้เหลือน้อยที่สุด
Hashtable ใน Java
คลาส Hashtableคือการนำโครงสร้างข้อมูลตารางแฮชไปใช้ คอลเล็กชันนี้สร้างขึ้นก่อน Java Collection Framework แต่ถูกรวมไว้ในภายหลัง เช่นเดียวกับคอลเลกชั่น "ต้น" ทั้งหมด (จาก Java 1.0) ตารางแฮชจะถูกซิงโครไนซ์ (เมธอดเกือบทั้งหมดถูกทำเครื่องหมายว่าซิงโครไนซ์) เนื่องจากปัจจัยนี้ hashtable จึงมีปัญหาด้านประสิทธิภาพอย่างมาก ดังนั้น เริ่มจาก Java 1.2 ในกรณีส่วนใหญ่ ขอแนะนำให้ใช้อินเทอร์เฟซแผนที่แบบอื่นๆเนื่องจากขาดการซิงโครไนซ์ โดยปกติแล้วHashMapจะเป็นการแทนที่ที่เหมาะสมที่สุด ดังนั้นคลาสHashtable<K,V>ประกอบด้วยคีย์และค่า มันเก็บคีย์ตามหลักการของการแฮช คู่ของคีย์-ค่าจะถูกเก็บไว้ใน "บัคเก็ต" ที่เก็บข้อมูลร่วมกันสร้าง "ตาราง" ซึ่งเป็นอาร์เรย์ภายในชนิดหนึ่ง Hashtable ใช้รหัสแฮชของคีย์เพื่อกำหนดบัคเก็ตที่คู่คีย์/ค่าควรแมป ฟังก์ชันแฮชช่วยให้รับตำแหน่งฝากข้อมูลจากแฮชโค้ดของคีย์ได้ ฟังก์ชันนี้ส่งคืนตัวเลขจำนวนเต็มสำหรับวัตถุ อย่างที่เรากล่าวไว้ข้างต้นว่าอ็อบเจกต์สองตัวที่เท่ากันจะมีรหัสแฮชเหมือนกัน ในขณะที่ออบเจกต์สองตัวที่ไม่เท่ากันอาจไม่ได้มีรหัสแฮชต่างกันเสมอไป อ็อบเจ็กต์ต่างๆ ที่ใส่ใน hashtable อาจมีรหัสแฮชเดียวกัน เพื่อแก้ไขปัญหานี้ (การชนกัน) อาร์เรย์ของรายการจะใช้ในแฮชเทเบิล คู่ที่แมปกับบัคเก็ตเดียวจะถูกจัดเก็บไว้ในรายการ และการอ้างอิงรายการนี้จะถูกจัดเก็บไว้ในดัชนีอาร์เรย์ตัวสร้าง Java Hashtable
- Hashtable()ตัวสร้างเริ่มต้น มันสร้างแฮชเทเบิลที่ว่างเปล่า (ความจุเริ่มต้นเริ่มต้น = 11, โหลดแฟกเตอร์ =0.75)
- Hashtable(int size)สร้างตารางแฮชตามขนาดที่ระบุ
- Hashtable(int size, float fillRatio)สร้างตารางแฮชของขนาดและอัตราส่วนการเติมที่ระบุ
- Hashtable(Map m)สร้างตารางแฮชที่มีการแมปเดียวกันกับแผนที่ที่กำหนด
การประกาศ Hashtable
คลาสHashtable Java ใช้อินเทอร์เฟซMap , CloneableและSerializable มันขยายคลาส พจนานุกรม
Hashtable.java
public class Hashtable<K,V>
extends Dictionary<K,V>
implements Map<K,V>, Cloneable, java.io.Serializable
Kคือประเภทของคีย์ที่ดูแลโดยแผนที่ Vคือประเภทของค่าที่แมป ตัวอย่าง:
Hashtable<Student, Integer> myHTable = new Hashtable<>();
วิธีการนำเข้า hashtable java
Java Hashtable อยู่ในแพ็คเกจjava.util ดังนั้นให้ใช้import java.util.Hashtable; ในรหัสของคุณ โดยปกติคุณจะได้รับคำแนะนำจาก IDE ของคุณเกี่ยวกับเรื่องนี้การดำเนินการหลักที่แฮชเทเบิล
การดำเนินการหลักของ Hashtable คือการรับ การแทรกไปยังคอลเลกชัน และการลบออกจากที่นั่น นี่คือการดำเนินการทั้งสามนี้คือ:- Object get(Object key)ส่งคืนค่าของ Object ที่มีคีย์ที่ระบุ คืนค่า null หากไม่พบคีย์ดังกล่าว
- วางวัตถุ (คีย์วัตถุ, ค่าวัตถุ)แมปคีย์ที่ระบุกับค่าที่ระบุ ทั้งคีย์และค่าไม่สามารถเป็นโมฆะได้
- int size()ส่งคืนจำนวนรายการในตารางแฮช
- บูลีนมี (ค่าวัตถุ)ตรวจสอบว่าค่าที่ระบุอยู่ในตารางแฮชหรือไม่ ถ้าเป็นเช่นนั้น เมธอดจะส่งกลับค่าจริง มิฉะนั้นจะส่งกลับค่าเท็จ
- บูลีนมีค่า (ค่าวัตถุ)ตรวจสอบว่าค่าที่ระบุอยู่ในตารางแฮชหรือไม่ ถ้าเป็นเช่นนั้น เมธอดจะส่งกลับค่าจริง มิฉะนั้นจะส่งกลับค่าเท็จ
- void clear()ลบรายการทั้งหมดออกจาก hashtable
- บูลีนมีคีย์ (คีย์วัตถุ)คืนค่าจริงหากคีย์ที่ระบุมีอยู่ในตารางแฮช มิฉะนั้นส่งคืนค่าเท็จ
- บูลีน isEmpty()คืนค่าจริงหากตารางแฮชว่างเปล่าหรือเป็นเท็จหากมีคีย์อย่างน้อยหนึ่งรายการ
- void rehash()เพิ่มขนาดของ hashtable และ rehashes คีย์ทั้งหมดของมัน
การใช้งานตารางแฮช รหัส Java:
มาสร้าง ชั้น เรียนของนักเรียน กันเถอะ :
import java.util.Date;
public class Student {
String surname;
String name;
String secondName;
Long birthday; // Long instead of long is used by Gson/Jackson json parsers and various orm databases
public Student(String surname, String name, String secondName, Date birthday ){
this.surname = surname;
this.name = name;
this.secondName = secondName;
this.birthday = birthday == null ? 0 : birthday.getTime();
}
@Override
public int hashCode(){
//TODO: check for nulls
return (surname + name + secondName + birthday).hashCode();
}
@Override
public boolean equals(Object other_) {
Student other = (Student)other_;
return (surname == null || surname.equals(other.surname) )
&& (name == null || name.equals(other.name))
&& (secondName == null || secondName.equals(other.secondName))
&& (birthday == null || birthday.equals(other.birthday));
}
}
นี่คือตัวอย่าง Java Hashtable ใส่ Objects ของ คลาส Student สองรายการ ลงใน hashtable จากนั้นลบบางส่วนและตรวจสอบพารามิเตอร์บางตัว
public class HashTableExample {
public static void main(String[] args) {
Hashtable<Student, Integer> myHTable = new Hashtable<>();
Student sarah1 = new Student("Sarah","Connor", "Jane", null);
Student john = new Student("John","Connor", "Kyle", new Date(1985, 02-1, 28)); // date not exists
myHTable.put(john,1);
myHTable.put(sarah1,0);
System.out.println(myHTable.get(john));
System.out.println(myHTable.isEmpty());
System.out.println(myHTable.size());
System.out.println(myHTable.contains(1));
myHTable.remove(john);
System.out.println(myHTable.contains(0));
System.out.println(myHTable.contains(1));
System.out.println(myHTable.containsKey(sarah1));
}
}
ผลลัพธ์ของการรันโปรแกรมคือ:
1
false
2
true
true
false
true
HashMap กับ Hashtable
- Hashtable คล้ายกับ HashMap ใน Java ความแตกต่างที่สำคัญที่สุดคือ Hashtable ถูกซิงโครไนซ์ในขณะที่ HashMap ไม่ใช่ ดังนั้น Hashtable จึงช้ากว่า HashMap เนื่องจากการซิงโครไนซ์
- ยกเว้นปัญหาการซิงโครไนซ์ Hashtable ไม่อนุญาตให้ใช้ null เป็นค่าหรือคีย์ HashMap อนุญาตให้ใช้คีย์ Null หนึ่งคีย์และค่า Null หลายค่า
- Hashtable สืบทอดคลาสพจนานุกรมในขณะที่ HashMap สืบทอดคลาส AbstractMap
- HashMap ถูกสำรวจโดย Iterator Hashtable สามารถข้ามผ่านได้ไม่เพียง แต่โดย Iterator เท่านั้น แต่ยังผ่าน Enumerator ได้อีกด้วย
ตัวอย่าง Java hashtable (คีย์ Hashtable vs HashMap null)
นี่คือรหัสแฟรกเมนต์เพื่อแสดงค่า Null ที่ใช้เป็นคีย์และค่าใน HashMapและHashtable
// Null key Java hashtable example and hashmap example
try{
System.out.println("Hashtable");
Hashtable hashTable = new Hashtable();
hashTable.put(null, new Object());
}catch(Exception ex){
ex.printStackTrace();
}
System.out.println("HashMap");
HashMap hashMap = new HashMap();
hashMap.put(null, new Object());
System.out.println("as you see no exceptions with null key in HashMap");
}
ผลลัพธ์ของการรันโปรแกรมที่มีแฟรกเมนต์นี้:
java.lang.NullPointerException
at java.base/java.util.Hashtable.put(Hashtable.java:480)
at Character.main(Character.java:58)
HashMap
as you see no exceptions with null key in HashMap
GO TO FULL VERSION