Java Hashtable sınıfı, Java Collection Framework'ün en eski üyelerinden biridir. Matematiksel karma tablo veri yapısının bir uygulamasıdır. Java hashtable'da dahili olarak, anahtar/değer çiftlerinin depolandığı kovalar bulunur. Hashtable, HashMap'e oldukça benzer . Aralarındaki en önemli fark: Hashtable senkronize edilirken HashMap değil.

Veri yapısı olarak hashtable

Hashtable , verilerin bir dizi biçiminde depolandığı bir veri yapısıdır. Her veri değerinin benzersiz bir anahtar değeri vardır. Anahtar biliniyorsa, gerekli verilere erişim çok hızlıdır. Böylece, ekleme ve arama işlemleri veri boyutundan bağımsız olarak hızlıdır. Hash Tablosu, verileri tutmak için bir diziden ve bir öğenin yerleştirilmesi gereken bir dizin oluşturmak için karmadan oluşur. karma nedir? Nesneyi bir dizi karaktere (kod) eşleyen bir kuraldır. Genellikle bu tür bir işlev, büyük bir veri parçasını küçük bir tamsayı değerine dönüştürür. Hash işlevleri farklı olabilir, ancak hepsi belirli özellikler sunar:
  • Belirli bir nesne, belirli karma koduna sahiptir.
  • İki eşit nesne aynı karma kodlara sahiptir. Tersi doğru değil.
  • İki hash kodu farklıysa, nesneler kesinlikle eşit değildir.
  • Farklı nesneler aynı hash koduna sahip olabilir. Bu çok nadir olay, çarpışmayı çağırır. İyi karma işlevi, çarpışma olasılığını en aza indirir.
Hash İşlevini bir Nesneye uygulamanın sonucu hashCode öğesini çağırır .

Java'da hashtable

Hashtable sınıfı, bir karma tablo veri yapısının uygulanmasıdır. Bu koleksiyon, Java Collection Framework'ten daha önce oluşturuldu, ancak daha sonra ona dahil edildi. Tüm "erken" koleksiyonlar gibi (Java 1.0'dan), bir hashtable senkronize edilir (neredeyse tüm yöntemler senkronize olarak işaretlenir). Bu faktör nedeniyle, hashtable önemli performans sorunlarına sahiptir. Bu nedenle, Java 1.2'den başlayarak, çoğu durumda senkronizasyon eksikliğinden dolayı Harita arayüzünün diğer uygulamalarının kullanılması önerilir . Genellikle HashMap en uygun alternatiftir. So Sınıfı Hashtable<K,V>anahtarlar ve değerlerden oluşur. Anahtarları karma ilkesine göre saklar. Anahtar/değer çiftleri "gruplarda" saklanır. Kovalar birlikte bir tür dahili dizi olan bir "tablo" oluşturur. Hashtable, anahtar/değer çiftinin eşlenmesi gereken yeri belirlemek için anahtarın karma kodunu kullanır. Karma işlevi, Key'in karma kodundan kova konumunun alınmasını sağlar. Bu işlev, bir nesne için bir tam sayı döndürür. Yukarıda söylediğimiz gibi, iki eşit nesne aynı hashcode'a sahipken, eşit olmayan iki nesne her zaman farklı hashcode'lara sahip olmayabilir. Bir hash tablosuna konulan farklı nesneler aynı hash koduna sahip olabilir. Bu sorunu çözmek için (çarpışma) hashtable'da liste dizileri kullanılır. Tek bir kovaya eşlenen çiftler bir listede saklanır ve bu liste referansı dizi indeksinde saklanır.

Hashtable Java Oluşturucuları

  • Hashtable() , varsayılan kurucu. Boş bir karma tablo oluşturur. (Varsayılan başlangıç ​​kapasitesi = 11, yük faktörü =0,75).
  • Hashtable(int size) belirtilen boyutta bir karma tablo oluşturur.
  • Hashtable(int size, float fillRatio), belirtilen boyutta ve dolgu oranında karma tablo oluşturur.
  • Hashtable(Map m), verilen Harita ile aynı eşlemelere sahip bir karma tablo oluşturur.

Hashtable Bildirimi

Hashtable Java sınıfı, Map , Cloneable ve Serializable arayüzlerini uygular. Dictionary sınıfını genişletir .

Hashtable.java
public class Hashtable<K,V>
    extends Dictionary<K,V>
    implements Map<K,V>, Cloneable, java.io.Serializable
K, harita tarafından tutulan anahtar türüdür. V , eşlenen değerlerin türüdür. Örnek:

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

hashtable java nasıl içe aktarılır

Java Hashtable, java.util paketinin içindedir . Öyleyse import java.util.Hashtable'ı kullanın; kodunuzda. Genellikle IDE'nizden bununla ilgili bir ipucu alırsınız.

Hashtable ana işlemleri

Hashtable'ın ana işlemleri alma, koleksiyona ekleme ve oradan çıkarmadır. İşte bu üç işlem:
  • Object get(Object key), belirtilen anahtara sahip olan Object'in değerini döndürür. Böyle bir anahtar bulunmazsa null döndürür.
  • Object put(Object key, Object value) belirtilen anahtarı belirtilen değere eşler. Ne anahtar ne de değer boş olamaz.
  • Object remove(Object key), girişi (anahtar ve karşılık gelen değer) hashtable'dan kaldırır.
Diğer önemli işlemler:
  • int size(), hash tablosundaki girişlerin miktarını döndürür.
  • boolean içerir(Nesne değeri), belirtilen değerin karma tablosunda olup olmadığını kontrol eder. Eğer öyleyse, yöntem true döndürür, aksi takdirde false döndürür.
  • boolean includeValue(Object value), belirtilen değerin hash tablosunda olup olmadığını kontrol eder. Eğer öyleyse, yöntem true döndürür, aksi takdirde false döndürür.
  • void clear() hash tablosundaki tüm girişleri kaldırır.
  • boolean includeKey(Object key), hash tablosunda belirtilen anahtar varsa true, aksi takdirde false döndürür.
  • boolean isEmpty(), karma tablo boşsa doğru, en az bir anahtar içeriyorsa yanlış döndürür.
  • void rehash() hash tablosunun boyutunu büyütür ve tüm anahtarlarını yeniden hash eder.

Karma tablo uygulaması, Java kodu:

Bir Öğrenci sınıfı oluşturalım :

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));
   }
}
İşte Java Hashtable örneği. Student sınıfından iki Nesneyi hashtable'a koyalım , sonra bazılarını kaldırıp bazı parametreleri kontrol edelim.

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));
   }
}
Çalışan programın sonucu:

1
false
2
true
true
false
true

HashMap ve Hashtable

  • Hashtable, Java'daki HashMap'e benzer. En önemli fark, HashMap değilken Hashtable'ın senkronize olmasıdır. Bu nedenle Hashtable, senkronizasyon nedeniyle HashMap'ten daha yavaştır.
  • Senkronizasyon sorunu dışında Hashtable, null'un bir değer veya anahtar olarak kullanılmasına izin vermez. HashMap, bir boş anahtara ve birden çok boş değere izin verir.
  • Hashtable, Dictionary sınıfını devralırken HashMap, AbstractMap sınıfını devralır.
  • HashMap, Iterator tarafından geçilir. Hashtable sadece Iterator tarafından değil aynı zamanda Enumerator tarafından da gezilebilir.

Java hashtable örneği (Hashtable ve HashMap null anahtarı)

İşte HashMap ve Hashtable'da anahtar ve değer olarak kullanılan boş değeri gösteren bir parça kodu

// 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");
  }
Bu parçayı içeren programı çalıştırmanın sonucu:

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

Çözüm

Hashtable'ı gerçek projelerde çok sık kullanmazsınız, ancak eski projelerde bu veri yapısını karşılamak kolaydır. Her neyse, en azından röportajlarınız için Java'nın Veri Yapılarının ne olduğunu ve nasıl çalıştığını anlamak önemlidir. Benzerlikleri nedeniyle genellikle Hashtable yerine HashMap nesneleri kullanılır. HashMap daha etkilidir (senkronize değildir) ve anahtar olarak boş olabilir.