CodeGym /Blog Java /Aleatoriu /Java Hashtable
John Squirrels
Nivel
San Francisco

Java Hashtable

Publicat în grup
Clasa Java Hashtable este unul dintre cei mai vechi membri ai Java Collection Framework. Este o implementare a structurii de date a tabelului hash matematic. În Java, tabelul hashtable conține în interior găleți în care sunt stocate perechile cheie/valoare. Hashtable este destul de similar cu HashMap . Cea mai semnificativă diferență între ele: Hashtable este sincronizat în timp ce HashMap nu este.

Hashtable ca structură de date

Hashtable este o structură de date în care datele sunt stocate într-un format de matrice. Fiecare valoare de date are o valoare cheie unică. Dacă cheia este cunoscută, accesul la datele necesare este foarte rapid. Deci, operațiunile de inserare și căutare sunt rapide independent de dimensiunea datelor. Hash Table constă dintr-o matrice pentru a păstra datele și hash pentru generare un index unde ar trebui să fie localizat un element. Ce este hashingul? Este o regulă care mapează Obiectul într-un set de caractere (cod). De obicei, acest tip de funcție convertește o bucată mare de date într-o valoare întreagă mică. Funcțiile hash pot fi diferite, dar toate prezintă anumite proprietăți:
  • Un anumit obiect are un anumit cod hash.
  • Două obiecte egale au aceleași coduri hash. Reversul nu este adevărat.
  • Dacă două coduri hash sunt diferite, cu siguranță obiectele nu sunt egale.
  • Diferite obiecte pot avea același cod hash. Acest eveniment foarte rar se numește coliziune. Funcția hash bună minimizează probabilitatea de coliziuni.
Rezultatul aplicării funcției Hash la un obiect apelează hashCode .

Hashtable în Java

Clasa hashtable este implementarea unei structuri de date tabel hash. Această colecție a fost creată mai devreme decât Java Collection Framework, dar a fost inclusă ulterior în ea. La fel ca toate colecțiile „primare” (din Java 1.0), o tabelă hash este sincronizată (aproape toate metodele sunt marcate ca sincronizate). Din cauza acestui factor, hashtable are probleme semnificative de performanță. Prin urmare, pornind de la Java 1.2, în majoritatea cazurilor se recomandă utilizarea altor implementări ale interfeței Map din cauza lipsei lor de sincronizare. De obicei , HashMap este cel mai potrivit înlocuitor. Deci Class Hashtable<K,V>constă din chei și valori. Stochează cheile pe principiul hashingului. Perechile cheie-valoare sunt stocate în „găleți”. Gălețile construiesc împreună o „tabelă”, un fel de matrice internă. Hashtable utilizează codul hash al cheii pentru a determina o grupă în care ar trebui mapată perechea cheie/valoare. Funcția hash vă permite să obțineți locația găleții din codul hash al Key. Această funcție returnează un număr întreg pentru un obiect. După cum am spus mai sus, două obiecte egale au același cod hash, în timp ce două obiecte inegale ar putea să nu aibă întotdeauna coduri hash diferite. Diferite obiecte, introduse într-o tabelă hash, pot avea același cod hash. Pentru a rezolva această problemă (coliziune) sunt folosite matrice de liste în hashtable. Perechile mapate la o singură găleată sunt stocate într-o listă și această referință de listă este stocată în indexul matricei.

Constructori Java hashtable

  • Hashtable() , constructorul implicit. Acesta creează un hashtable gol. (Capacitate inițială implicită = 11, factor de încărcare = 0,75).
  • Hashtable(int size) construiește un hashtable cu dimensiunea specificată.
  • Hashtable (int size, float fillRatio) creează un tabel hash cu dimensiunea și raportul de umplere specificate.
  • Hashtable(Map m) creează un hashtable cu aceleași mapări ca și harta dată.

Declarație Hashtable

Clasa Hashtable Java implementează interfețele Map , Cloneable și Serializable . Extinde clasa Dicționarului .

Hashtable.java
public class Hashtable<K,V>
    extends Dictionary<K,V>
    implements Map<K,V>, Cloneable, java.io.Serializable
K este tipul de chei menținute de hartă. V este tipul de valori mapate. Exemplu:

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

Cum se importă hashtable java

Java Hashtable se află în pachetul java.util . Deci, utilizați import java.util.Hashtable; în codul dvs. De obicei, veți primi un indiciu de la IDE-ul dvs. despre acest lucru.

Operațiuni principale hashtable

Principalele operațiuni ale Hashtable sunt obținerea, inserarea în colecție și eliminarea de acolo. Iată aceste trei operațiuni:
  • Object get(Object key) returnează valoarea obiectului care are cheia specificată. Returnează null dacă nu este găsită o astfel de cheie.
  • Object put(cheie obiect, valoare obiect) mapează cheia specificată la valoarea specificată. Nici cheia, nici valoarea nu pot fi nule.
  • Object remove(Object key) elimină intrarea (cheia și valoarea corespunzătoare) din hashtable.
Celelalte operațiuni importante:
  • int size() returnează cantitatea de intrări din tabelul hash.
  • boolean contains(Object value) verifică dacă valoarea specificată este în tabelul hash. Dacă da, metoda returnează true, altfel returnează false.
  • boolean containsValue(Valoare obiect) verifică dacă valoarea specificată este în tabelul hash. Dacă da, metoda returnează true, altfel returnează false.
  • void clear() elimină toate intrările din hashtable.
  • boolean containsKey(Object key) returnează adevărat dacă cheia specificată există în tabelul hash, altfel returnează false.
  • boolean isEmpty() returnează true dacă tabela hash este goală sau false dacă conține cel puțin o cheie.
  • void rehash() mărește dimensiunea tabelului hash și rehash toate cheile sale.

Implementarea tabelului hash, cod Java:

Să creăm o clasă Student :

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));
   }
}
Iată un exemplu Java Hashtable . Să punem două obiecte ale clasei Student în hashtable, apoi să eliminăm unele și să verificăm câțiva parametri.

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));
   }
}
Rezultatul rulării programului este:

1
false
2
true
true
false
true

HashMap vs Hashtable

  • Hashtable este similar cu HashMap în Java. Cea mai semnificativă diferență este că Hashtable este sincronizat în timp ce HashMap nu este. Prin urmare, Hashtable este mai lent decât HashMap din cauza sincronizării.
  • Cu excepția problemei de sincronizare, Hashtable nu permite utilizarea null ca valoare sau cheie. HashMap permite o cheie nulă și mai multe valori nule.
  • Hashtable moștenește clasa Dicționar în timp ce HashMap moștenește clasa AbstractMap.
  • HashMap este traversat de Iterator. Hashtable poate fi parcurs nu numai de Iterator, ci și de Enumerator.

Exemplu Java hashtable (Hashtable vs HashMap cheie nulă)

Iată un cod fragment pentru a demonstra un null folosit ca cheie și valoare în HashMap și 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");
  }
Rezultatul rulării programului care conține acest fragment:

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

Concluzie

Nu prea des veți folosi Hashtable în proiecte reale, dar este ușor să întâlniți această structură de date în proiecte vechi. Oricum, este important să înțelegeți ce Structuri de Date are Java și cum funcționează acestea, cel puțin pentru interviurile dvs. De obicei, obiectele HashMap sunt folosite în loc de Hashtable din cauza asemănării lor. HashMap este mai eficient (nu este sincronizat) și ar putea avea ca cheie null.
Comentarii
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION