John Squirrels
ระดับ
San Francisco

Java Hashtable

เผยแพร่ในกลุ่ม
คลาส Java Hashtableเป็นหนึ่งในสมาชิกที่เก่าแก่ที่สุดของ Java Collection Framework เป็นการดำเนินการตามโครงสร้างข้อมูลตารางแฮชทางคณิตศาสตร์ ใน Java hashtable ภายในประกอบด้วยบัคเก็ตที่เก็บคู่คีย์/ค่า Hashtableค่อนข้างคล้ายกับHashMap ความแตกต่างที่สำคัญที่สุดระหว่างพวกเขา: Hashtableถูกซิงโครไนซ์ในขณะที่HashMapไม่ใช่

Hashtable เป็นโครงสร้างข้อมูล

Hashtableเป็นโครงสร้างข้อมูลที่เก็บข้อมูลในรูปแบบอาร์เรย์ ค่าข้อมูลทุกค่ามีค่าคีย์ที่ไม่ซ้ำกัน หากทราบคีย์ การเข้าถึงข้อมูลที่ต้องการจะรวดเร็วมาก ดังนั้น การแทรกและการค้นหาจึงรวดเร็วโดยไม่ขึ้นกับขนาดข้อมูล ตารางแฮชประกอบด้วยอาร์เรย์เพื่อเก็บข้อมูลและแฮชสำหรับสร้างดัชนีที่องค์ประกอบควรอยู่ การแฮชคืออะไร? เป็นกฎที่แมปวัตถุเป็นชุดอักขระ (รหัส) โดยปกติแล้วฟังก์ชันประเภทนี้จะแปลงข้อมูลขนาดใหญ่ให้เป็นค่าจำนวนเต็มขนาดเล็ก ฟังก์ชันแฮชอาจแตกต่างกัน แต่ทั้งหมดมีคุณสมบัติบางอย่าง:
  • วัตถุเฉพาะมีรหัสแฮชเฉพาะ
  • อ็อบเจกต์สองตัวที่เท่ากันมีรหัสแฮชเหมือนกัน สิ่งที่ตรงกันข้ามไม่เป็นความจริง
  • หากรหัสแฮชสองรหัสต่างกัน แสดงว่าวัตถุนั้นไม่เท่ากันอย่างแน่นอน
  • วัตถุที่แตกต่างกันอาจมีรหัสแฮชเดียวกัน เหตุการณ์ที่หายากมากนี้เรียกว่าการปะทะกัน ฟังก์ชันแฮชที่ดีช่วยลดความน่าจะเป็นของการชนกันให้เหลือน้อยที่สุด
ผลลัพธ์ของการใช้ฟังก์ชันแฮชกับออบเจกต์เรียก hashCode

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 หากไม่พบคีย์ดังกล่าว
  • วางวัตถุ (คีย์วัตถุ, ค่าวัตถุ)แมปคีย์ที่ระบุกับค่าที่ระบุ ทั้งคีย์และค่าไม่สามารถเป็นโมฆะได้
  • ลบวัตถุ (คีย์วัตถุ)ลบรายการ (คีย์และค่าที่เกี่ยวข้อง) จาก hashtable
การดำเนินงานที่สำคัญอื่น ๆ :
  • 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

บทสรุป

คุณไม่ค่อยจะใช้ Hashtable ในโครงการจริง แต่เป็นเรื่องง่ายที่จะปฏิบัติตามโครงสร้างข้อมูลนี้ในโครงการเก่า อย่างไรก็ตาม สิ่งสำคัญคือต้องเข้าใจว่า Data Structures Java มีอะไรบ้างและทำงานอย่างไร อย่างน้อยก็สำหรับการสัมภาษณ์ของคุณ โดยปกติแล้ววัตถุ HashMap จะถูกใช้แทน Hashtable เนื่องจากมีความคล้ายคลึงกัน HashMap มีประสิทธิภาพมากกว่า (ไม่ซิงโครไนซ์) และอาจมีค่าว่างเป็นคีย์
ความคิดเห็น
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION