CodeGym /Java Blog /Willekeurig /Java-hashtabel
John Squirrels
Niveau 41
San Francisco

Java-hashtabel

Gepubliceerd in de groep Willekeurig
Java Hashtable- klasse is een van de oudste leden van Java Collection Framework. Het is een implementatie van de datastructuur van een wiskundige hashtabel. In Java bevat de hashtabel intern buckets waarin de sleutel/waarde-paren worden opgeslagen. Hashtable lijkt veel op HashMap . Het belangrijkste verschil tussen hen: Hashtable is gesynchroniseerd terwijl HashMap dat niet is.

Hashtable als datastructuur

Hashtable is een gegevensstructuur waarin gegevens worden opgeslagen in een array-indeling. Elke gegevenswaarde heeft een unieke sleutelwaarde. Als de sleutel bekend is, is de toegang tot de benodigde gegevens zeer snel. Invoeg- en zoekbewerkingen zijn dus snel onafhankelijk van de gegevensgrootte. Hash Table bestaat uit een array om gegevens en hashing bij te houden voor het genereren van een index waar een element zich zou moeten bevinden. Wat is hashen? Het is een regel die het object toewijst aan een reeks tekens (code). Gewoonlijk zet zo'n functie een groot stuk gegevens om in een kleine integerwaarde. Hash-functies kunnen verschillen, maar ze hebben allemaal bepaalde eigenschappen:
  • Een bepaald object heeft de bepaalde hashcode.
  • Twee gelijke objecten hebben dezelfde hashcodes. Het omgekeerde is niet waar.
  • Als twee hashcodes verschillend zijn, zijn de objecten zeker niet gelijk.
  • Verschillende objecten kunnen dezelfde hashcode hebben. Deze zeer zeldzame gebeurtenis roept botsing op. De goede hash-functie minimaliseert de kans op botsingen.
Het resultaat van het toepassen van de hashfunctie op een object roept hashCode op .

Hashtabel op Java

Hashtable- klasse is de implementatie van een hash-tabelgegevensstructuur. Deze verzameling is eerder gemaakt dan het Java Collection Framework, maar is er later in opgenomen. Zoals alle "vroege" verzamelingen (van Java 1.0), is een hashtabel gesynchroniseerd (bijna alle methoden zijn gemarkeerd als gesynchroniseerd). Vanwege deze factor heeft hashtable aanzienlijke prestatieproblemen. Vandaar dat vanaf Java 1.2 in de meeste gevallen wordt aanbevolen om andere implementaties van de kaartinterface te gebruiken vanwege het gebrek aan synchronisatie. Meestal is HashMap de meest geschikte vervanging. Dus klasse -hashtabel<K,V>bestaat uit sleutels en waarden. Het slaat sleutels op volgens het principe van hashing. Sleutel-waardeparen worden opgeslagen in "buckets". De buckets vormen samen een "tabel", een soort interne array. Hashtable gebruikt de hashcode van de sleutel om een ​​bucket te bepalen waar het sleutel/waarde-paar moet worden toegewezen. Met de hash-functie kunt u de bucketlocatie ophalen uit de hashcode van Key. Deze functie retourneert een geheel getal voor een object. Zoals we hierboven al zeiden, hebben twee gelijke objecten dezelfde hashcode, terwijl twee ongelijke objecten niet altijd verschillende hashcodes hebben. Verschillende objecten die in een hashtabel worden geplaatst, kunnen dezelfde hashcode hebben. Om dit probleem (botsing) op te lossen, wordt een reeks lijsten gebruikt in de hashtabel. De paren die aan een enkele bucket zijn toegewezen, worden opgeslagen in een lijst en deze lijstreferentie wordt opgeslagen in de array-index.

Hashtabel Java-constructeurs

  • Hashtable() , de standaardconstructor. Het creëert een lege hashtabel. (Standaard initiële capaciteit = 11, belastingsfactor = 0,75).
  • Hashtable(int size) bouwt een hashtabel van gespecificeerde grootte.
  • Hashtable(int size, float fillRatio) creëert een hashtabel van gespecificeerde grootte en vulverhouding.
  • Hashtable(Map m) creëert een hashtabel met dezelfde mappings als de gegeven Map.

Hashtable-verklaring

De Hashtable Java-klasse implementeert Map , Cloneable en Serializable interfaces. Het breidt de Dictionary- klasse uit.

Hashtable.java
public class Hashtable<K,V>
    extends Dictionary<K,V>
    implements Map<K,V>, Cloneable, java.io.Serializable
K is het type sleutels dat door de kaart wordt onderhouden. V is het type toegewezen waarden. Voorbeeld:

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

Hoe hashtabel java te importeren

Java Hashtable bevindt zich in het java.util- pakket. Gebruik dus import java.util.Hashtable; in je code. Meestal krijg je hierover een hint van je IDE.

Hashtable belangrijkste bewerkingen

De belangrijkste bewerkingen van de hashtabel zijn ophalen, invoegen in de verzameling en daaruit verwijderen. Hier zijn deze drie operaties:
  • Object get (Objectsleutel) retourneert de waarde van het object met de opgegeven sleutel. Retourneert null als een dergelijke sleutel niet wordt gevonden.
  • Object put (Object key, Object value) wijst de gespecificeerde sleutel toe aan de gespecificeerde waarde. Noch de sleutel, noch de waarde kan null zijn.
  • Object remove (Object-sleutel) verwijdert de invoer (sleutel en bijbehorende waarde) uit de hashtabel.
De andere belangrijke bewerkingen:
  • int size() retourneert het aantal vermeldingen in de hashtabel.
  • boolean bevat (Objectwaarde) controleert of de opgegeven waarde in de hashtabel staat. Als dat zo is, retourneert methode true, else retourneert false.
  • boolean comesValue(Objectwaarde) controleert of de opgegeven waarde in de hashtabel staat. Als dat zo is, retourneert methode true, else retourneert false.
  • void clear() verwijdert alle invoer uit de hashtabel.
  • boolean comesKey (Objectsleutel) retourneert true als de opgegeven sleutel bestaat in de hashtabel, anders retourneert false.
  • boolean isEmpty() retourneert true als de hashtabel leeg is of false als deze ten minste één sleutel bevat.
  • void rehash() vergroot de grootte van de hashtabel en hasht alle sleutels opnieuw.

Implementatie hashtabel, Java-code:

Laten we een Student- klasse maken:

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));
   }
}
Hier is een Java Hashtable- voorbeeld. Laten we twee objecten van de klasse Student in de hashtabel plaatsen, enkele verwijderen en enkele parameters controleren.

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));
   }
}
Het resultaat van het lopende programma is:

1
false
2
true
true
false
true

HashMap versus Hashtable

  • Hashtable is vergelijkbaar met HashMap in Java. Het belangrijkste verschil is dat Hashtable wordt gesynchroniseerd en HashMap niet. Daarom is Hashtable langzamer dan HashMap vanwege synchronisatie.
  • Behalve synchronisatieproblemen, staat Hashtable niet toe dat null wordt gebruikt als waarde of sleutel. HashMap staat één null-sleutel en meerdere null-waarden toe.
  • Hashtable erft de Dictionary-klasse, terwijl HashMap de AbstractMap-klasse erft.
  • HashMap wordt doorlopen door Iterator. Hashtable kan niet alleen door Iterator maar ook door Enumerator worden doorlopen.

Java-hashtabelvoorbeeld (Hashtable versus HashMap null-sleutel)

Hier is een fragmentcode om een ​​null te demonstreren die wordt gebruikt als sleutel en waarde in HashMap en 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");
  }
Het resultaat van het uitvoeren van het programma dat dit fragment bevat:

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

Conclusie

Je zult Hashtable niet vaak gebruiken in echte projecten, maar het is gemakkelijk om deze datastructuur in oude projecten tegen te komen. Hoe dan ook, het is belangrijk om te begrijpen wat Data Structures Java heeft en hoe ze werken, in ieder geval voor je interviews. Gewoonlijk worden HashMap-objecten gebruikt in plaats van Hashtable vanwege hun gelijkenis. HashMap is effectiever (het is niet gesynchroniseerd) en zou null als sleutel kunnen hebben.
Opmerkingen
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION