CodeGym /Java Blog /Acak /Java Hashtable
John Squirrels
Level 41
San Francisco

Java Hashtable

Dipublikasikan di grup Acak
Kelas Java Hashtable adalah salah satu anggota tertua dari Java Collection Framework. Ini adalah implementasi dari struktur data tabel hash matematika. Di Java hashtable secara internal berisi ember tempat pasangan kunci/nilai disimpan. Hashtable sangat mirip dengan HashMap . Perbedaan paling signifikan di antara keduanya: Hashtable disinkronkan sedangkan HashMap tidak.

Hashtable sebagai struktur data

Hashtable adalah struktur data tempat data disimpan dalam format array. Setiap nilai data memiliki nilai kunci yang unik. Jika kunci diketahui, akses ke data yang dibutuhkan sangat cepat. Jadi, operasi penyisipan dan pencarian cepat secara independen pada ukuran data. Tabel Hash terdiri dari larik untuk menyimpan data dan hashing untuk menghasilkan indeks tempat elemen harus ditempatkan. Apa itu hashing? Ini adalah aturan yang memetakan Objek ke dalam sekumpulan karakter (kode). Biasanya fungsi semacam itu mengubah sebagian besar data menjadi nilai integer kecil. Fungsi hash bisa berbeda, tetapi semuanya mengirimkan properti tertentu:
  • Objek tertentu memiliki kode hash tertentu.
  • Dua objek yang sama memiliki kode hash yang sama. Kebalikannya tidak benar.
  • Jika dua kode hash berbeda, objeknya pasti tidak sama.
  • Objek yang berbeda mungkin memiliki kode hash yang sama. Peristiwa yang sangat langka ini disebut tabrakan. Fungsi hash yang baik meminimalkan kemungkinan tabrakan.
Hasil penerapan Fungsi Hash ke Obyek memanggil kode hash .

Hashtable di Jawa

Kelas hashtable adalah implementasi dari struktur data tabel hash. Koleksi ini dibuat lebih awal dari Java Collection Framework, tetapi kemudian disertakan di dalamnya. Seperti semua koleksi "awal" (dari Java 1.0), hashtable disinkronkan (hampir semua metode ditandai sebagai disinkronkan). Karena faktor ini, hashtable memiliki masalah kinerja yang signifikan. Oleh karena itu, mulai dari Java 1.2, dalam banyak kasus disarankan untuk menggunakan implementasi lain dari antarmuka Peta karena kurangnya sinkronisasi. Biasanya HashMap adalah pengganti yang paling tepat. Jadi Kelas Hashtable<K,V>terdiri dari key dan value. Ini menyimpan kunci pada prinsip hashing. Pasangan kunci-nilai disimpan dalam "ember". Bucket bersama-sama membuat "tabel", semacam larik internal. Hashtable menggunakan kode hash kunci untuk menentukan keranjang tempat pasangan kunci/nilai harus dipetakan. Fungsi hash memungkinkan untuk mendapatkan lokasi ember dari kode hash Key. Fungsi ini mengembalikan bilangan bulat untuk suatu objek. Seperti yang kami katakan di atas, dua objek yang sama memiliki kode hash yang sama, sedangkan dua objek yang tidak sama mungkin tidak selalu memiliki kode hash yang berbeda. Objek yang berbeda, dimasukkan ke dalam hashtable mungkin memiliki kode hash yang sama. Untuk mengatasi masalah ini (tabrakan) array daftar digunakan dalam hashtable. Pasangan yang dipetakan ke satu keranjang disimpan dalam daftar dan referensi daftar ini disimpan dalam indeks larik.

Konstruktor Java Hashtable

  • Hashtable() , konstruktor default. Itu menciptakan hashtable kosong. (Kapasitas awal default = 11, faktor beban = 0,75).
  • Hashtable(int size) membuat hashtable dengan ukuran tertentu.
  • Hashtable(int size, float fillRatio) membuat tabel hash dengan ukuran dan rasio pengisian yang ditentukan.
  • Hashtable(Map m) membuat hashtable dengan pemetaan yang sama dengan Peta yang diberikan.

Deklarasi Hashtable

Kelas Hashtable Java mengimplementasikan antarmuka Map , Cloneable dan Serializable . Ini memperluas kelas Kamus .

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

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

Bagaimana cara mengimpor java hashtable

Java Hashtable ada di dalam paket java.util . Jadi gunakan import java.util.Hashtable; dalam kode Anda. Biasanya Anda akan mendapatkan petunjuk dari IDE Anda tentang hal ini.

Operasi utama hastable

Operasi utama Hashtable adalah mendapatkan, memasukkan ke koleksi, dan menghapus dari sana. Di sini ketiga operasi ini adalah:
  • Object get(Object key) mengembalikan nilai Object yang telah ditentukan kuncinya. Mengembalikan nol jika tidak ada kunci yang ditemukan.
  • Tempatkan objek(Kunci objek, Nilai objek) memetakan kunci yang ditentukan ke nilai yang ditentukan. Baik kunci maupun nilainya tidak boleh nol.
  • Penghapusan objek(Kunci objek) menghapus entri (kunci dan nilai yang sesuai) dari hashtable.
Operasi penting lainnya:
  • int size() mengembalikan jumlah entri dalam tabel hash.
  • boolean berisi(Nilai objek) memeriksa apakah nilai yang ditentukan ada di tabel hash. Jika demikian, metode mengembalikan nilai benar, yang lain mengembalikan nilai salah.
  • boolean containsValue(Object value) memeriksa apakah nilai yang ditentukan ada di tabel hash. Jika demikian, metode mengembalikan nilai benar, yang lain mengembalikan nilai salah.
  • void clear() menghapus semua entri dari hashtable.
  • boolean containsKey(Object key) mengembalikan true jika kunci yang ditentukan ada di tabel hash, jika tidak mengembalikan false.
  • boolean isEmpty() mengembalikan true jika hashtable kosong atau false jika berisi setidaknya satu kunci.
  • void rehash() meningkatkan ukuran hashtable dan mengulang semua kuncinya.

Implementasi tabel hash, kode Java:

Mari kita buat kelas Siswa :

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 adalah contoh Java Hashtable . Mari tempatkan dua Objek dari kelas Siswa ke hashtable, lalu hapus beberapa dan periksa 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 running programnya adalah :

1
false
2
true
true
false
true

HashMap vs Hashtable

  • Hashtable mirip dengan HashMap di Jawa. Perbedaan yang paling signifikan adalah bahwa Hashtable disinkronkan sedangkan HashMap tidak. Oleh karena itu, Hashtable lebih lambat dari HashMap karena sinkronisasi.
  • Kecuali masalah sinkronisasi, Hashtable tidak mengizinkan null untuk digunakan sebagai nilai atau kunci. HashMap memungkinkan satu kunci nol dan beberapa nilai nol.
  • Hashtable mewarisi kelas Kamus sementara HashMap mewarisi kelas AbstractMap.
  • HashMap dilalui oleh Iterator. Hashtable dapat dilalui tidak hanya oleh Iterator tetapi juga oleh Enumerator.

Contoh Java hashtable (Hashtable vs HashMap null key)

Berikut adalah kode fragmen untuk mendemonstrasikan null yang digunakan sebagai kunci dan nilai di 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 menjalankan program yang berisi fragmen 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 terlalu sering menggunakan Hashtable dalam proyek nyata, tetapi mudah untuk memenuhi struktur data ini dalam proyek lama. Bagaimanapun, penting untuk memahami apa Struktur Data yang dimiliki Java dan bagaimana cara kerjanya, setidaknya untuk wawancara Anda. Biasanya objek HashMap digunakan sebagai pengganti Hashtable karena kemiripannya. HashMap lebih efektif (tidak disinkronkan) dan dapat memiliki null sebagai kunci.
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION