CodeGym /Java blogg /Slumpmässig /Java hashable
John Squirrels
Nivå
San Francisco

Java hashable

Publicerad i gruppen
Java Hashtable -klassen är en av de äldsta medlemmarna i Java Collection Framework. Det är en implementering av matematisk hashtabellsdatastruktur. I Java innehåller hashable internt hinkar där nyckel/värdeparen lagras. Hashtable är ganska likt HashMap . Den viktigaste skillnaden mellan dem: Hashtable är synkroniserat medan HashMap inte är det.

Hastbar som datastruktur

Hashtable är en datastruktur där data lagras i ett arrayformat. Varje datavärde har ett unikt nyckelvärde. Om nyckeln är känd går åtkomsten till de data som behövs mycket snabb. Så insättnings- och sökoperationer är snabba oberoende av datastorleken. Hash-tabellen består av en array för att hålla data och hasha för generering av ett index där ett element ska placeras. Vad är hashing? Det är en regel som mappar objektet till en uppsättning tecken (kod). Vanligtvis omvandlar den typen av funktion en stor bit data till ett litet heltalsvärde. Hashfunktioner kan vara olika, men de skickar alla in vissa egenskaper:
  • Ett visst objekt har den specifika hashkoden.
  • Två lika objekt har samma hashkoder. Det omvända är inte sant.
  • Om två hashkoder är olika är objekten definitivt inte lika.
  • Olika objekt kan ha samma hashkod. Denna mycket sällsynta händelse kallar kollision. Den goda hashfunktionen minimerar sannolikheten för kollisioner.
Resultatet av att tillämpa Hash-funktion på ett objekt anropar hashCode .

Hastbar i Java

Hashable -klassen är implementeringen av en hashtabelldatastruktur. Denna samling skapades tidigare än Java Collection Framework, men inkluderades senare i den. Liksom alla "tidiga" samlingar (från Java 1.0) är en hashtabell synkroniserad (nästan alla metoder är markerade som synkroniserade). På grund av denna faktor har hashable betydande prestandaproblem. Därför, från och med Java 1.2, rekommenderas det i de flesta fall att använda andra implementeringar av kartgränssnittet grund av deras brist på synkronisering. Vanligtvis är HashMap den lämpligaste ersättningen. Så Class Hashtable<K,V>består av nycklar och värden. Den lagrar nycklar enligt principen om hash. Nyckel-värdepar lagras i "hinkar". Hinkarna konstruerar tillsammans ett "bord", en slags intern array. Hashtable använder nyckelns hashkod för att bestämma en hink där nyckel/värdeparet ska mappas. Hash-funktionen låter dig få buckets position från Keys hashkod. Denna funktion returnerar ett heltal för ett objekt. Som vi sa ovan har två lika objekt samma hashkod, medan två ojämlika objekt kanske inte alltid har olika hashkoder. Olika objekt som placeras i en hashtabell kan ha samma hashkod. För att lösa detta problem (kollision) används en rad listor i hashable. Paren som mappas till en enda hink lagras i en lista och denna listreferens lagras i arrayindex.

Hashtable Java Constructors

  • Hashtable() , standardkonstruktorn. Det skapar en tom hashtabell. (Standard initial kapacitet = 11, belastningsfaktor = 0,75).
  • Hashtable(int size) konstruerar en hashtabell av specificerad storlek.
  • Hashtable (int size, float fillRatio) skapar hashtabell med specificerad storlek och fyllningsförhållande.
  • Hashtable(Map m) skapar en hashtabell med samma mappningar som den givna kartan.

Hastbar deklaration

Hashtable Java - klassen implementerar Map , Cloneable och Serialiserbara gränssnitt. Det utökar klassen Ordbok .

Hashtable.java
public class Hashtable<K,V>
    extends Dictionary<K,V>
    implements Map<K,V>, Cloneable, java.io.Serializable
K är den typ av nycklar som upprätthålls av kartan. V är typen av mappade värden. Exempel:

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

Hur man importerar hashbar Java

Java Hashtable finns i java.util- paketet. Så använd import java.util.Hashtable; i din kod. Vanligtvis får du en ledtråd från din IDE om detta.

Hastbar huvudverksamhet

Huvudfunktionerna för Hashtable är att hämta, infoga i samlingen och ta bort därifrån. Här är dessa tre operationer:
  • Objekt get(Objektnyckel) returnerar värdet på objektet som har specificerat nyckeln. Returnerar null om ingen sådan nyckel hittas.
  • Objekt put(Objektnyckel, Objektvärde) mappar den angivna nyckeln till det angivna värdet. Varken nyckeln eller värdet kan vara null.
  • Object remove(Object key) tar bort posten (nyckel och motsvarande värde) från hashtabell.
De andra viktiga operationerna:
  • int size() returnerar antalet poster i hashtabellen.
  • boolean contains(Object value) kontrollerar om specificerat värde finns i hashtabellen. Om så är fallet returnerar metoden true, annars returnerar false.
  • boolean containsValue(Objektvärde) kontrollerar om det angivna värdet finns i hashtabellen. Om så är fallet returnerar metoden true, annars returnerar false.
  • void clear() tar bort alla poster från hashtabellen.
  • boolean containsKey(Objektnyckel) returnerar true om specificerad nyckel finns i hashtabellen, annars returnerar false.
  • boolean isEmpty() returnerar true om hashtabellen är tom eller false om den innehåller minst en nyckel.
  • void rehash() ökar storleken på hashtabellen och återhastar alla dess nycklar.

Implementering av hashtabell, Java-kod:

Låt oss skapa en studentklass :

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));
   }
}
Här är Java Hashtable- exempel. Låt oss lägga in två objekt från Studentklassen i hashtabellen, ta bort några och kontrollera några parametrar.

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 att köra programmet är:

1
false
2
true
true
false
true

HashMap vs Hashtable

  • Hashtable liknar HashMap i Java. Den viktigaste skillnaden är att Hashtable är synkroniserat medan HashMap inte är det. Därför är Hashtable långsammare än HashMap på grund av synkronisering.
  • Förutom synkroniseringsproblem tillåter inte Hashtable att null används som ett värde eller nyckel. HashMap tillåter en nullnyckel och flera nollvärden.
  • Hashtable ärver Dictionary-klassen medan HashMap ärver AbstractMap-klassen.
  • HashMap korsas av Iterator. Hashtable kan passeras inte bara av Iterator utan också av Enumerator.

Java hashable exempel (Hashtable vs HashMap null nyckel)

Här är en fragmentkod för att visa en noll som används som nyckel och värde i HashMap och 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 att köra programmet som innehåller detta 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

Slutsats

Du kommer inte riktigt ofta att använda Hashtable i riktiga projekt, men det är lätt att möta denna datastruktur i gamla projekt. Hur som helst, det är viktigt att förstå vilka Data Structures Java har och hur de fungerar, åtminstone för dina intervjuer. Vanligtvis används HashMap-objekt istället för Hashtable på grund av deras likhet. HashMap är mer effektivt (det är inte synkroniserat) och kan ha null som nyckel.
Kommentarer
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION