CodeGym /Java Blog /Random-IT /Tabella hash Java
John Squirrels
Livello 41
San Francisco

Tabella hash Java

Pubblicato nel gruppo Random-IT
La classe Java Hashtable è uno dei membri più vecchi di Java Collection Framework. È un'implementazione della struttura dati della tabella hash matematica. In Java hashtable contiene internamente i bucket in cui sono archiviate le coppie chiave/valore. Hashtable è abbastanza simile a HashMap . La differenza più significativa tra loro: Hashtable è sincronizzato mentre HashMap no.

Hashtable come struttura dati

Hashtable è una struttura di dati in cui i dati vengono archiviati in un formato di matrice. Ogni valore di dati ha un valore di chiave univoco. Se la chiave è nota, l'accesso ai dati necessari è molto rapido. Quindi, le operazioni di inserimento e ricerca sono veloci indipendentemente dalla dimensione dei dati. Hash Table è costituito da un array per conservare i dati e l'hashing per la generazione di un indice in cui dovrebbe essere posizionato un elemento. Cos'è l'hashing? È una regola che mappa l'Oggetto in un insieme di caratteri (codice). Di solito questo tipo di funzione converte una grande quantità di dati in un piccolo valore intero. Le funzioni hash potrebbero essere diverse, ma tutte inviano determinate proprietà:
  • Un particolare oggetto ha il particolare codice hash.
  • Due oggetti uguali hanno gli stessi codici hash. Non è vero il contrario.
  • Se due codici hash sono diversi, gli oggetti non sono sicuramente uguali.
  • Oggetti diversi possono avere lo stesso codice hash. Questo evento molto raro chiama collisione. La buona funzione hash riduce al minimo la probabilità di collisioni.
Il risultato dell'applicazione della funzione Hash a un oggetto chiama hashCode .

Tabella hash in Java

La classe Hashtable è l'implementazione di una struttura di dati della tabella hash. Questa raccolta è stata creata prima del Java Collection Framework, ma è stata successivamente inclusa in esso. Come tutte le raccolte "precoci" (da Java 1.0), una tabella hash è sincronizzata (quasi tutti i metodi sono contrassegnati come sincronizzati). A causa di questo fattore, hashtable presenta notevoli problemi di prestazioni. Quindi, a partire da Java 1.2, nella maggior parte dei casi si consiglia di utilizzare altre implementazioni dell'interfaccia Map a causa della loro mancanza di sincronizzazione. Di solito HashMap è il sostituto più appropriato. Quindi Class Hashtable<K,V>consiste di chiavi e valori. Memorizza le chiavi secondo il principio dell'hashing. Le coppie chiave-valore sono archiviate in "bucket". I secchi insieme costruiscono una "tabella", una specie di matrice interna. Hashtable utilizza l'hashcode della chiave per determinare un bucket in cui deve essere mappata la coppia chiave/valore. La funzione hash consente di ottenere la posizione del bucket dall'hashcode di Key. Questa funzione restituisce un numero intero per un oggetto. Come abbiamo detto sopra, due oggetti uguali hanno lo stesso hashcode, mentre due oggetti disuguali potrebbero non avere sempre hashcode diversi. Oggetti diversi, inseriti in una tabella hash, possono avere lo stesso codice hash. Per risolvere questo problema (collisione) vengono utilizzati array di liste in hashtable. Le coppie mappate a un singolo bucket vengono archiviate in un elenco e questo riferimento all'elenco viene archiviato nell'indice dell'array.

Costruttori Java hashtable

  • Hashtable() , il costruttore predefinito. Crea una tabella hash vuota. (Capacità iniziale predefinita = 11, fattore di carico =0,75).
  • Hashtable(int size) costruisce una tabella hash di dimensione specificata.
  • Hashtable(int size, float fillRatio) crea una tabella hash di dimensione e rapporto di riempimento specificati.
  • Hashtable(Map m) crea una tabella hash con le stesse mappature della mappa data.

Dichiarazione hashtable

La classe Java Hashtable implementa le interfacce Map , Cloneable e Serializable . Estende la classe Dictionary .

Hashtable.java
public class Hashtable<K,V>
    extends Dictionary<K,V>
    implements Map<K,V>, Cloneable, java.io.Serializable
K è il tipo di chiavi mantenute dalla mappa. V è il tipo di valori mappati. Esempio:

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

Come importare hashtable java

Java Hashtable si trova all'interno del pacchetto java.util . Quindi usa import java.util.Hashtable; nel tuo codice Di solito riceverai un suggerimento dal tuo IDE su questo.

Operazioni principali di hashtable

Le operazioni principali di Hashtable sono l'acquisizione, l'inserimento nella raccolta e la rimozione da lì. Qui queste tre operazioni sono:
  • Object get(Object key) restituisce il valore dell'oggetto che ha specificato key. Restituisce null se non viene trovata tale chiave.
  • Object put(Object key, Object value) associa la chiave specificata al valore specificato. Né la chiave né il valore possono essere nulli.
  • Object remove(Object key) rimuove la voce (chiave e valore corrispondente) dalla tabella hash.
Le altre operazioni importanti:
  • int size() restituisce la quantità di voci nella tabella hash.
  • boolean contains(Object value) controlla se il valore specificato è nella tabella hash. In tal caso, il metodo restituisce true, altrimenti restituisce false.
  • boolean containsValue(Object value) controlla se il valore specificato è nella tabella hash. In tal caso, il metodo restituisce true, altrimenti restituisce false.
  • void clear() rimuove tutte le voci dalla tabella hash.
  • boolean containsKey(Object key) restituisce true se la chiave specificata esiste nella tabella hash, altrimenti restituisce false.
  • boolean isEmpty() restituisce true se la tabella hash è vuota o false se contiene almeno una chiave.
  • void rehash() aumenta la dimensione della tabella hash e rielabora tutte le sue chiavi.

Implementazione della tabella hash, codice Java:

Creiamo una classe 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));
   }
}
Ecco un esempio di hashtable Java . Mettiamo due oggetti della classe Student in hashtable, quindi rimuoviamone alcuni e controlliamo alcuni 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));
   }
}
Il risultato dell'esecuzione del programma è:

1
false
2
true
true
false
true

HashMap contro Hashtable

  • Hashtable è simile a HashMap in Java. La differenza più significativa è che Hashtable è sincronizzato mentre HashMap no. Pertanto, Hashtable è più lento di HashMap a causa della sincronizzazione.
  • Ad eccezione del problema di sincronizzazione, Hashtable non consente di utilizzare null come valore o chiave. HashMap consente una chiave nulla e più valori nulli.
  • Hashtable eredita la classe Dictionary mentre HashMap eredita la classe AbstractMap.
  • HashMap è attraversato da Iterator. Hashtable può essere attraversato non solo da Iterator ma anche da Enumerator.

Esempio di hashtable Java (chiave nulla Hashtable vs HashMap)

Ecco un frammento di codice per dimostrare un null utilizzato come chiave e valore in HashMap e 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");
  }
Il risultato dell'esecuzione del programma che contiene questo frammento:

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

Conclusione

Non userai spesso Hashtable in progetti reali, ma è facile incontrare questa struttura di dati in vecchi progetti. Ad ogni modo, è importante capire cosa ha Java Structures Java e come funzionano, almeno per le tue interviste. Di solito vengono usati oggetti HashMap al posto di Hashtable a causa della loro somiglianza. HashMap è più efficace (non è sincronizzato) e potrebbe avere null come chiave.
Commenti
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION