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.
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 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
GO TO FULL VERSION