CodeGym /Java blog /Tilfældig /Java hashable
John Squirrels
Niveau
San Francisco

Java hashable

Udgivet i gruppen
Java Hashtable -klassen er et af de ældste medlemmer af Java Collection Framework. Det er en implementering af matematisk hash-tabeldatastruktur. I Java indeholder hashable internt buckets, hvor nøgle/værdi-parrene er gemt. Hashtable minder ret meget om HashMap . Den væsentligste forskel mellem dem: Hashtable er synkroniseret, mens HashMap ikke er det.

Hastbar som datastruktur

Hashtable er en datastruktur, hvor data gemmes i et array-format. Hver dataværdi har en unik nøgleværdi. Hvis nøglen er kendt, er adgangen til de nødvendige data meget hurtig. Så indsættelse og søgeoperationer er hurtige uafhængigt af datastørrelsen. Hash-tabel består af et array til at holde data og hashing til generering af et indeks, hvor et element skal placeres. Hvad er hashing? Det er en regel, der kortlægger objektet i et sæt tegn (kode). Normalt konverterer den slags funktion et stort stykke data til en lille heltalsværdi. Hash-funktioner kan være forskellige, men de indsender alle visse egenskaber:
  • Et bestemt objekt har den særlige hash-kode.
  • To lige store objekter har de samme hash-koder. Det omvendte er ikke sandt.
  • Hvis to hash-koder er forskellige, er objekterne bestemt ikke ens.
  • Forskellige objekter kan have den samme hash-kode. Denne meget sjældne hændelse kalder kollision. Den gode hash-funktion minimerer sandsynligheden for kollisioner.
Resultatet af at anvende Hash-funktion på et objekt kalder hashCode .

Hastable i Java

Hashtable- klassen er implementeringen af ​​en hash-tabeldatastruktur. Denne samling blev oprettet tidligere end Java Collection Framework, men blev senere inkluderet i den. Som alle "tidlige" samlinger (fra Java 1.0), er en hashtabel synkroniseret (næsten alle metoder er markeret som synkroniseret). På grund af denne faktor har hashable betydelige ydeevneproblemer. Derfor, fra Java 1.2, anbefales det i de fleste tilfælde at bruge andre implementeringer af kortgrænsefladen grund af deres manglende synkronisering. Normalt er HashMap den mest passende erstatning. Så Klasse Hashtable<K,V>består af nøgler og værdier. Den gemmer nøgler efter princippet om hashing. Nøgleværdi-par gemmes i "bøtter". Spandene konstruerer tilsammen et "bord", en slags internt array. Hashtable bruger nøglens hashkode til at bestemme en bucket, hvor nøgle/værdi-parret skal kortlægges. Hash-funktionen giver mulighed for at få bucket-placering fra Keys hashkode. Denne funktion returnerer et heltal for et objekt. Som vi sagde ovenfor har to ens objekter den samme hashkode, mens to ulige objekter måske ikke altid har forskellige hashkoder. Forskellige objekter, der indsættes i en hashtabel, kan have den samme hash-kode. For at løse dette problem (kollision) bruges en række lister i hashable. De par, der er knyttet til en enkelt bucket, gemmes i en liste, og denne listereference gemmes i matrixindeks.

Hashtable Java-konstruktører

  • Hashtable() , standardkonstruktøren. Det opretter en tom hashtabel. (Standard indledende kapacitet = 11, belastningsfaktor = 0,75).
  • Hashtable(int size) konstruerer en hashtabel af specificeret størrelse.
  • Hashtable (int-størrelse, float fillRatio) opretter hash-tabel med specificeret størrelse og fyldforhold.
  • Hashtable(Map m) opretter en hashtabel med de samme tilknytninger som det givne kort.

Hastbar erklæring

Hashtable Java - klassen implementerer kort- , klonings- og serialiseringsgrænseflader . Det udvider Ordbogsklassen .

Hashtable.java
public class Hashtable<K,V>
    extends Dictionary<K,V>
    implements Map<K,V>, Cloneable, java.io.Serializable
K er den type nøgler, der vedligeholdes af kortet. V er typen af ​​kortlagte værdier. Eksempel:

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

Sådan importeres hashbar java

Java Hashtable er inde i java.util -pakken. Så brug import java.util.Hashtable; i din kode. Normalt vil du få et hint fra din IDE om dette.

Hashtable hovedoperationer

De vigtigste operationer i Hashtable er at hente, indsætte i samlingen og fjerne derfra. Her er disse tre operationer:
  • Objekt get(Objektnøgle) returnerer værdien af ​​det objekt, der har angivet nøglen. Returnerer null, hvis der ikke findes en sådan nøgle.
  • Objekt put(Objektnøgle, Objektværdi) knytter den angivne nøgle til den angivne værdi. Hverken nøglen eller værdien kan være nul.
  • Objekt fjern(Objektnøgle) fjerner indtastningen (nøgle og tilsvarende værdi) fra hashtabellen.
De andre vigtige operationer:
  • int size() returnerer antallet af poster i hash-tabellen.
  • boolean contains(Objektværdi) kontrollerer, om den angivne værdi er i hash-tabellen. Hvis det er tilfældet, returnerer metoden sand, ellers returnerer den falsk.
  • boolean containsValue(Objektværdi) kontrollerer, om den angivne værdi er i hash-tabellen. Hvis det er tilfældet, returnerer metoden sand, ellers returnerer den falsk.
  • void clear() fjerner alle poster fra hashtabellen.
  • boolean containsKey(Objektnøgle) returnerer sand, hvis den specificerede nøgle findes i hash-tabellen, ellers returnerer false.
  • boolean isEmpty() returnerer sand, hvis hashtabellen er tom eller falsk, hvis den indeholder mindst én nøgle.
  • void rehash() øger størrelsen af ​​hashtabellen og rehasher alle dens nøgler.

Hash tabel implementering, Java-kode:

Lad os oprette en elevklasse :

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));
   }
}
Her er Java Hashtable eksempel. Lad os lægge to objekter fra Student- klassen ind i hashtabellen, og derefter fjerne nogle og kontrollere nogle parametre.

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));
   }
}
Resultatet af kørende program er:

1
false
2
true
true
false
true

HashMap vs Hashtable

  • Hashtable ligner HashMap i Java. Den væsentligste forskel er, at Hashtable er synkroniseret, mens HashMap ikke er det. Derfor er Hashtable langsommere end HashMap på grund af synkronisering.
  • Med undtagelse af synkroniseringsproblem tillader Hashtable ikke, at null bruges som en værdi eller nøgle. HashMap tillader én null-nøgle og flere null-værdier.
  • Hashtable arver Dictionary-klassen, mens HashMap arver AbstractMap-klassen.
  • HashMap krydses af Iterator. Hashtable kan krydses ikke kun af Iterator, men også af Enumerator.

Java hashtable eksempel (Hashtable vs HashMap null nøgle)

Her er en fragmentkode til at demonstrere en null, der bruges som nøgle og værdi i HashMap og 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");
  }
Resultatet af at køre programmet, der indeholder dette 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

Konklusion

Du vil ikke rigtig ofte bruge Hashtable i rigtige projekter, men det er nemt at møde denne datastruktur i gamle projekter. Under alle omstændigheder er det vigtigt at forstå, hvilke datastrukturer Java har, og hvordan de fungerer, i det mindste til dine interviews. Normalt bruges HashMap-objekter i stedet for Hashtable på grund af deres lighed. HashMap er mere effektivt (det er ikke synkroniseret) og kunne have null som nøgle.
Kommentarer
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION