CodeGym /Blog Java /rawak /Jadual Hash Java
John Squirrels
Tahap
San Francisco

Jadual Hash Java

Diterbitkan dalam kumpulan
Kelas Java Hashtable ialah salah satu ahli tertua Java Collection Framework. Ia adalah pelaksanaan struktur data jadual hash matematik. Dalam jadual hash Java secara dalaman mengandungi baldi tempat pasangan kunci/nilai disimpan. Hashtable hampir serupa dengan HashMap . Perbezaan paling ketara antara mereka: Hashtable disegerakkan manakala HashMap tidak.

Hashtable sebagai struktur data

Hashtable ialah struktur data di mana data disimpan dalam format tatasusunan. Setiap nilai data mempunyai nilai kunci yang unik. Jika kunci diketahui, akses kepada data yang diperlukan adalah sangat pantas. Jadi, operasi penyisipan dan carian adalah pantas secara bebas pada saiz data. Jadual Hash terdiri daripada tatasusunan untuk menyimpan data dan pencincangan untuk menjana indeks di mana elemen harus ditempatkan. Apakah pencincangan? Ia adalah peraturan yang memetakan Objek ke dalam satu set aksara (kod). Biasanya fungsi seperti itu menukar sekeping data yang besar kepada nilai integer yang kecil. Fungsi hash mungkin berbeza, tetapi semuanya menyerahkan sifat tertentu:
  • Objek tertentu mempunyai kod cincang tertentu.
  • Dua objek yang sama mempunyai kod cincang yang sama. Sebaliknya tidak benar.
  • Jika dua kod cincang berbeza, objek pastinya tidak sama.
  • Objek yang berbeza mungkin mempunyai kod cincang yang sama. Peristiwa yang sangat jarang berlaku ini dipanggil perlanggaran. Fungsi cincang yang baik meminimumkan kebarangkalian perlanggaran.
Hasil daripada menggunakan Fungsi Hash pada Objek memanggil hashCode .

Hashtable di Jawa

Kelas Hashtable ialah pelaksanaan struktur data jadual hash. Koleksi ini dibuat lebih awal daripada Rangka Kerja Koleksi Java, tetapi kemudiannya dimasukkan ke dalamnya. Seperti semua koleksi "awal" (dari Java 1.0), jadual hash disegerakkan (hampir semua kaedah ditandakan sebagai disegerakkan). Disebabkan faktor ini, hashtable mempunyai masalah prestasi yang ketara. Oleh itu, bermula dari Java 1.2, dalam kebanyakan kes adalah disyorkan untuk menggunakan pelaksanaan lain antara muka Peta kerana kekurangan penyegerakan. Biasanya HashMap adalah pengganti yang paling sesuai. Jadi Kelas Hashtable<K,V>terdiri daripada kunci dan nilai. Ia menyimpan kunci berdasarkan prinsip pencincangan. Pasangan nilai kunci disimpan dalam "baldi". Baldi bersama-sama membina "jadual", sejenis tatasusunan dalaman. Hashtable menggunakan kod cincang kunci untuk menentukan baldi tempat pasangan kunci/nilai harus dipetakan. Fungsi cincang membolehkan untuk mendapatkan lokasi baldi daripada kod cincang Key. Fungsi ini mengembalikan nombor integer untuk objek. Seperti yang kita katakan di atas, dua objek yang sama mempunyai kod cincang yang sama, manakala dua objek yang tidak sama mungkin tidak selalu mempunyai kod cincang yang berbeza. Objek yang berbeza, dimasukkan ke dalam jadual cincang mungkin mempunyai kod cincang yang sama. Untuk menyelesaikan masalah ini (perlanggaran) pelbagai senarai digunakan dalam jadual hash. Pasangan yang dipetakan pada baldi tunggal disimpan dalam senarai dan rujukan senarai ini disimpan dalam indeks tatasusunan.

Pembina Java Hashtable

  • Hashtable() , pembina lalai. Ia mencipta jadual hash kosong. (Kapasiti awal lalai = 11, faktor beban =0.75).
  • Hashtable(int size) membina hashtable saiz yang ditentukan.
  • Hashtable(saiz int, float fillNisbah) mencipta jadual hash saiz dan nisbah isi yang ditentukan.
  • Hashtable(Map m) mencipta hashtable dengan pemetaan yang sama seperti Peta yang diberikan.

Pengisytiharan Hashtable

Kelas Hashtable Java melaksanakan antara muka Map , Cloneable dan Serializable . Ia memanjangkan kelas Kamus .

Hashtable.java
public class Hashtable<K,V>
    extends Dictionary<K,V>
    implements Map<K,V>, Cloneable, java.io.Serializable
K ialah jenis kekunci yang diselenggara oleh peta. V ialah jenis nilai yang dipetakan. Contoh:

Hashtable<Student, Integer> myHTable = new Hashtable<>();

Bagaimana untuk mengimport hashtable java

Java Hashtable berada di dalam pakej java.util . Jadi gunakan import java.util.Hashtable; dalam kod anda. Biasanya anda akan mendapat petunjuk daripada IDE anda tentang perkara ini.

Operasi utama Hashtable

Operasi utama Hashtable ialah mendapatkan, memasukkan ke koleksi dan mengalih keluar dari sana. Di sini tiga operasi ini adalah:
  • Object get(Object key) mengembalikan nilai Object yang mempunyai kunci yang ditentukan. Mengembalikan null jika tiada kunci sedemikian ditemui.
  • Object put(Object key, Object value) memetakan kunci yang ditentukan kepada nilai yang ditentukan. Baik kunci mahupun nilai tidak boleh menjadi batal.
  • Object remove(Object key) mengalih keluar masukan (kunci dan nilai yang sepadan) daripada hashtable.
Operasi penting lain:
  • int size() mengembalikan kuantiti entri dalam jadual cincang.
  • boolean mengandungi(Nilai objek) menyemak sama ada nilai yang ditentukan berada dalam jadual cincang. Jika ya, kaedah mengembalikan benar, jika tidak mengembalikan palsu.
  • boolean containsValue(Nilai objek) menyemak sama ada nilai yang ditentukan berada dalam jadual cincang. Jika ya, kaedah mengembalikan benar, jika tidak mengembalikan palsu.
  • void clear() mengalih keluar semua entri daripada jadual hash.
  • boolean containsKey(Objek kunci) mengembalikan benar jika kunci yang ditentukan wujud dalam jadual cincang, jika tidak kembali palsu.
  • boolean isEmpty() mengembalikan benar jika jadual hash kosong atau palsu jika mengandungi sekurang-kurangnya satu kunci.
  • void rehash() meningkatkan saiz jadual hash dan mencantum semula semua kuncinya.

Pelaksanaan jadual hash, kod Java:

Mari buat kelas Pelajar :

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));
   }
}
Berikut ialah contoh Java Hashtable . Mari letakkan dua Objek kelas Pelajar ke dalam jadual hash, kemudian alih keluar beberapa dan semak beberapa parameter.

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));
   }
}
Hasil daripada program yang dijalankan ialah:

1
false
2
true
true
false
true

HashMap lwn Hashtable

  • Hashtable adalah serupa dengan HashMap di Jawa. Perbezaan yang paling ketara ialah Hashtable disegerakkan manakala HashMap tidak. Oleh itu, Hashtable lebih perlahan daripada HashMap kerana penyegerakan.
  • Kecuali masalah penyegerakan, Hashtable tidak membenarkan null digunakan sebagai nilai atau kunci. HashMap membenarkan satu kunci nol dan berbilang nilai nol.
  • Hashtable mewarisi kelas Kamus manakala HashMap mewarisi kelas AbstractMap.
  • HashMap dilalui oleh Iterator. Hashtable boleh dilalui bukan sahaja oleh Iterator tetapi juga oleh Enumerator.

Contoh hashtable Java (Hashtable vs HashMap null key)

Berikut ialah kod serpihan untuk menunjukkan null yang digunakan sebagai kunci dan nilai dalam HashMap dan 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");
  }
Hasil daripada menjalankan program yang mengandungi serpihan ini:

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

Kesimpulan

Anda tidak begitu kerap menggunakan Hashtable dalam projek sebenar, tetapi mudah untuk memenuhi struktur data ini dalam projek lama. Bagaimanapun, adalah penting untuk memahami apa yang ada pada Data Structures Java dan cara ia berfungsi, sekurang-kurangnya untuk temu bual anda. Biasanya objek HashMap digunakan dan bukannya Hashtable kerana persamaannya. HashMap adalah lebih berkesan (ia tidak disegerakkan) dan boleh mempunyai null sebagai kunci.
Komen
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION