CodeGym /Java blog /Véletlen /Java Hashtable
John Squirrels
Szint
San Francisco

Java Hashtable

Megjelent a csoportban
A Java Hashtable osztály a Java Collection Framework egyik legrégebbi tagja. Ez a matematikai hash tábla adatstruktúra megvalósítása. Java-ban a hashtable belsőleg olyan gyűjtőhelyeket tartalmaz, amelyekben a kulcs/érték párok tárolódnak. A Hashtable nagyon hasonlít a HashMap-re . A legjelentősebb különbség köztük: a Hashtable szinkronizálva van, míg a HashMap nem.

Hashtable mint adatstruktúra

A Hashtable olyan adatstruktúra, amelyben az adatok tömb formátumban kerülnek tárolásra. Minden adatértéknek egyedi kulcsértéke van. Ha a kulcs ismert, a szükséges adatokhoz nagyon gyorsan hozzá lehet férni. Tehát a beillesztési és keresési műveletek az adatmérettől függetlenül gyorsak. A hash tábla egy tömbből áll, amely az adatokat tárolja, és egy index létrehozásához hash, ahol egy elemet el kell helyezni. Mi az a hashelés? Ez egy szabály, amely az objektumot egy karakterkészletre (kódra) képezi le. Általában ez a fajta függvény egy nagy adatot alakít át kis egész értékké. A hash függvények eltérőek lehetnek, de mindegyik megad bizonyos tulajdonságokat:
  • Egy adott objektumnak van egy adott hash kódja.
  • Két egyenlő objektumnak ugyanaz a hash kódja. Ennek a fordítottja nem igaz.
  • Ha két hash kód különbözik, az objektumok határozottan nem azonosak.
  • A különböző objektumok ugyanazzal a hash kóddal rendelkezhetnek. Ezt a nagyon ritka eseményt ütközésnek nevezik. A jó hash függvény minimalizálja az ütközések valószínűségét.
A hash-függvény objektumra történő alkalmazásának eredménye a hashCode-ot hívja meg .

Hashtable Java nyelven

A hashtable osztály egy hash tábla adatstruktúra megvalósítása. Ez a gyűjtemény korábban készült, mint a Java Collection Framework, de később bekerült abba. Mint minden „korai” gyűjtemény (a Java 1.0-tól), a hashtable is szinkronizált (majdnem minden metódus szinkronizáltként van megjelölve). E tényező miatt a hashtable jelentős teljesítményproblémákkal küzd. Ezért a Java 1.2-től kezdődően a legtöbb esetben a Map interfész más implementációinak használata javasolt azok szinkronizálásának hiánya miatt. Általában a HashMap a legmegfelelőbb csere. Tehát osztály Hashtable<K,V>kulcsokból és értékekből áll. A kulcsokat a hash elvén tárolja. A kulcs-érték párok „vödrökben” vannak tárolva. A vödrök együtt alkotnak egy „táblázatot”, egyfajta belső tömböt. A Hashtable a kulcs hashkódját használja annak meghatározására, hogy a kulcs/érték párnak melyik gyűjtősávot kell leképeznie. A hash funkció lehetővé teszi a vödör helyének megállapítását a kulcs hashkódjából. Ez a függvény egy egész számot ad vissza egy objektumhoz. Ahogy fentebb említettük, két egyenlő objektumnak ugyanaz a hashkódja, míg két nem egyenlő objektumnak nem mindig van különböző hashkódja. A hashtable-ba helyezett különböző objektumok ugyanazzal a hash-kóddal rendelkezhetnek. A probléma (ütközés) megoldására a hashtable listák tömbjét használják. Az egyetlen vödörhöz leképezett párok egy listában, a listahivatkozás pedig a tömbindexben tárolódnak.

Hashtable Java konstruktorok

  • Hashtable() , az alapértelmezett konstruktor. Üres hashtablet hoz létre. (Alapértelmezett kezdeti kapacitás = 11, terhelési tényező = 0,75).
  • Hashtable(int size) egy meghatározott méretű hashtablet hoz létre.
  • Hashtable (int size, float fillArtio) létrehozza a megadott méretű és kitöltési arányú hash táblázatot.
  • Hashtable(Map m) egy hashtablet hoz létre az adott térképpel megegyező leképezésekkel.

Hashtable nyilatkozat

A Hashtable Java osztály Map , Cloneable és Serializable felületeket valósít meg. Bővíti a szótár osztályt.

Hashtable.java
public class Hashtable<K,V>
    extends Dictionary<K,V>
    implements Map<K,V>, Cloneable, java.io.Serializable
K a térkép által karbantartott kulcsok típusa. V a leképezett értékek típusa. Példa:

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

Hogyan importálhatunk hashtable Java-t

A Java Hashtable a java.util csomagban található . Tehát használja az import java.util.Hashtable; a kódodban. Általában erre vonatkozó tippet kap az IDE-től.

Hashtable fő műveletek

A Hashtable fő műveletei a megszerzés, a gyűjteménybe való beillesztés és onnan történő eltávolítás. Itt ez a három művelet:
  • Az Object get(Object key) a megadott kulcsot tartalmazó objektum értékét adja vissza. Null értéket ad vissza, ha nem található ilyen kulcs.
  • Object put (Object key, Object value) leképezi a megadott kulcsot a megadott értékre. Sem a kulcs, sem az érték nem lehet nulla.
  • Az objektum eltávolítása (Object key) eltávolítja a bejegyzést (kulcsot és a megfelelő értéket) a hashtable-ból.
A többi fontos művelet:
  • Az int size() a bejegyzések mennyiségét adja vissza a hash táblában.
  • A logikai érték tartalmazza (Object value) ellenőrzi, hogy a megadott érték szerepel-e a hash táblában. Ha igen, akkor a metódus igaz, egyébként hamis értéket ad vissza.
  • Boolean includeValue(Object value) ellenőrzi, hogy a megadott érték szerepel-e a hash táblában. Ha igen, akkor a metódus igaz, egyébként hamis értéket ad vissza.
  • A void clear() eltávolítja az összes bejegyzést a hashtable-ból.
  • A logikai értelmezés tartalmazza a kulcs(Object key) értéket, ha a megadott kulcs létezik a hash táblában, ellenkező esetben hamis értéket ad vissza.
  • A logikai isEmpty() igazat ad vissza, ha a hashtable üres, vagy hamis értéket, ha legalább egy kulcsot tartalmaz.
  • A void rehash() megnöveli a hashtable méretét, és újrakivonatolja az összes kulcsát.

Hash tábla megvalósítás, Java kód:

Hozzunk létre egy diákosztályt :

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));
   }
}
Íme a Java Hashtable példa. Tegyük a Student osztály két objektumát hashtable-ba, majd távolítsunk el néhányat, és ellenőrizzünk néhány paramétert.

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));
   }
}
A program futtatásának eredménye:

1
false
2
true
true
false
true

HashMap vs Hashtable

  • A Hashtable hasonló a Java HashMap-hez. A legjelentősebb különbség az, hogy a Hashtable szinkronizálva van, míg a HashMap nem. Ezért a Hashtable lassabb, mint a HashMap a szinkronizálás miatt.
  • A szinkronizálási probléma kivételével a Hashtable nem teszi lehetővé a null értékként vagy kulcsként történő használatát. A HashMap egy nullkulcsot és több null értéket engedélyez.
  • A Hashtable örökli a Dictionary osztályt, míg a HashMap az AbstractMap osztályt.
  • A HashMap-et az Iterator járja be. A Hashtable-t nem csak az Iterator, hanem az Enumerator is bejárhatja.

Java hashtable példa (Hashtable vs HashMap null kulcs)

Itt van egy kódrészlet, amely bemutatja a HashMap és a Hashtable kulcsként és értékként használt nullát

// 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");
  }
A töredéket tartalmazó program futtatásának eredménye:

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

Következtetés

Valódi projektekben ritkán használja a Hashtable-t, de könnyű megfelelni ennek az adatszerkezetnek a régi projektekben. Mindenesetre fontos megérteni, hogy a Java milyen adatstruktúrákkal rendelkezik, és hogyan működnek, legalábbis az interjúk során. Általában HashMap objektumokat használnak a Hashtable helyett a hasonlóságuk miatt. A HashMap hatékonyabb (nincs szinkronizálva), és kulcsként null lehet.
Hozzászólások
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION