CodeGym /Java-blogg /Tilfeldig /Java hashable
John Squirrels
Nivå
San Francisco

Java hashable

Publisert i gruppen
Java Hashtable -klassen er et av de eldste medlemmene av Java Collection Framework. Det er en implementering av matematisk hashtabelldatastruktur. I Java inneholder hashtabell internt bøtter der nøkkel/verdi-parene er lagret. Hashtable er ganske lik HashMap . Den viktigste forskjellen mellom dem: Hashtable er synkronisert mens HashMap ikke er det.

Hastbar som datastruktur

Hashtable er en datastruktur der data lagres i et matriseformat. Hver dataverdi har en unik nøkkelverdi. Hvis nøkkelen er kjent, er tilgangen til de nødvendige dataene svært rask. Så innsettings- og søkeoperasjoner er raske uavhengig av datastørrelsen. Hash-tabell består av en matrise for å holde data og hashing for generering av en indeks der et element skal være plassert. Hva er hashing? Det er en regel som tilordner objektet til et sett med tegn (kode). Vanligvis konverterer den typen funksjon et stort stykke data til en liten heltallsverdi. Hash-funksjoner kan være forskjellige, men de sender alle inn visse egenskaper:
  • Et bestemt objekt har den bestemte hash-koden.
  • To like objekter har samme hash-koder. Det motsatte er ikke sant.
  • Hvis to hash-koder er forskjellige, er objektene definitivt ikke like.
  • Ulike objekter kan ha samme hash-kode. Denne svært sjeldne hendelsen kaller kollisjon. Den gode hash-funksjonen minimerer sannsynligheten for kollisjoner.
Resultatet av å bruke Hash-funksjon på et objekt kaller hashCode .

Hastbar i Java

Hashable- klassen er implementeringen av en hashtabelldatastruktur. Denne samlingen ble opprettet tidligere enn Java Collection Framework, men ble senere inkludert i den. Som alle "tidlige" samlinger (fra Java 1.0), er en hashtabell synkronisert (nesten alle metoder er merket som synkronisert). På grunn av denne faktoren har hashable betydelige ytelsesproblemer. Derfor, fra Java 1.2, anbefales det i de fleste tilfeller å bruke andre implementeringer av kartgrensesnittet grunn av manglende synkronisering. Vanligvis er HashMap den mest passende erstatningen. Så Class Hashtable<K,V>består av nøkler og verdier. Den lagrer nøkler etter hashing-prinsippet. Nøkkelverdi-par lagres i "bøtter". Bøttene konstruerer sammen et "bord", en slags intern array. Hashtable bruker nøkkelens hashkode for å bestemme en bøtte hvor nøkkel/verdi-paret skal kartlegges. Hash-funksjon lar deg hente bøtteplassering fra Keys hashkode. Denne funksjonen returnerer et heltall for et objekt. Som vi sa ovenfor har to like objekter samme hashkode, mens to ulike objekter kanskje ikke alltid har forskjellige hashkoder. Ulike objekter som legges inn i en hashtabell kan ha samme hash-kode. For å løse dette problemet (kollisjon) brukes en rekke lister i hashable. Parene som er tilordnet en enkelt bøtte lagres i en liste, og denne listereferansen lagres i matriseindeksen.

Hashtable Java-konstruktører

  • Hashtable() , standardkonstruktøren. Det lager en tom hashtabell. (Standard initialkapasitet = 11, lastfaktor =0,75).
  • Hashtable(int size) konstruerer en hashtabell med spesifisert størrelse.
  • Hashtable (int størrelse, flytefyllforhold) lager hashtabell med spesifisert størrelse og fyllforhold.
  • Hashtable(Map m) lager en hashtabell med samme tilordninger som det gitte kartet.

Hastbar erklæring

Hashtable Java - klassen implementerer Map , Cloneable og Serialiserbare grensesnitt. Det utvider Ordbok -klassen.

Hashtable.java
public class Hashtable<K,V>
    extends Dictionary<K,V>
    implements Map<K,V>, Cloneable, java.io.Serializable
K er typen nøkler som vedlikeholdes av kartet. V er typen kartlagte verdier. Eksempel:

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

Hvordan importere hashbar java

Java Hashtable er inne i java.util -pakken. Så bruk import java.util.Hashtable; i koden din. Vanligvis vil du få et hint fra din IDE om dette.

Hastbare hovedoperasjoner

Hovedoperasjonene til Hashtable er å hente, sette inn i samlingen og fjerne derfra. Her er disse tre operasjonene:
  • Objekt get(Objektnøkkel) returnerer verdien til Objektet som har spesifisert nøkkel. Returnerer null hvis ingen slik nøkkel blir funnet.
  • Object put(Objektnøkkel, Objektverdi) tilordner den angitte nøkkelen til den angitte verdien. Verken nøkkelen eller verdien kan være null.
  • Objekt fjern (Objektnøkkel) fjerner oppføringen (nøkkel og tilsvarende verdi) fra hashtabellen.
De andre viktige operasjonene:
  • int size() returnerer antallet oppføringer i hash-tabellen.
  • boolean contains(Objektverdi) sjekker om spesifisert verdi er i hash-tabellen. I så fall returnerer metoden true, ellers returnerer false.
  • boolean containsValue(Objektverdi) sjekker om spesifisert verdi er i hashtabellen. I så fall returnerer metoden true, ellers returnerer false.
  • void clear() fjerner alle oppføringer fra hashtabellen.
  • boolean containsKey(Object key) returnerer true hvis spesifisert nøkkel finnes i hash-tabellen, ellers returnerer false.
  • boolean isEmpty() returnerer true hvis hashtabellen er tom eller usann hvis den inneholder minst én nøkkel.
  • void rehash() øker størrelsen på hashtabellen og rehasher alle nøklene.

Hash-tabellimplementering, Java-kode:

La oss lage en studentklasse :

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. La oss legge to objekter fra Student- klassen inn i hashtabellen, og deretter fjerne noen og sjekke noen parametere.

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 av å kjøre programmet er:

1
false
2
true
true
false
true

HashMap vs Hashtable

  • Hashtable ligner på HashMap i Java. Den viktigste forskjellen er at Hashtable er synkronisert mens HashMap ikke er det. Derfor er Hashtable tregere enn HashMap på grunn av synkronisering.
  • Med unntak av synkroniseringsproblem, tillater ikke Hashtable at null brukes som en verdi eller nøkkel. HashMap tillater én nullnøkkel og flere nullverdier.
  • Hashtable arver Dictionary-klassen mens HashMap arver AbstractMap-klassen.
  • HashMap krysses av Iterator. Hashtable kan krysses ikke bare av Iterator, men også av Enumerator.

Java hashable eksempel (Hashtable vs HashMap null nøkkel)

Her er en fragmentkode for å demonstrere en null som brukes som nøkkel og verdi 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 av å kjøre programmet som inneholder dette fragmentet:

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

Konklusjon

Du bruker ikke så ofte Hashtable i virkelige prosjekter, men det er lett å møte denne datastrukturen i gamle prosjekter. Uansett er det viktig å forstå hvilke datastrukturer Java har og hvordan de fungerer, i det minste for intervjuene dine. Vanligvis brukes HashMap-objekter i stedet for Hashtable på grunn av likhetene deres. HashMap er mer effektivt (det er ikke synkronisert) og kan ha null som nøkkel.
Kommentarer
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION