CodeGym /Java Blog /Random /Java Hashtable
John Squirrels
Antas
San Francisco

Java Hashtable

Nai-publish sa grupo
Ang klase ng Java Hashtable ay isa sa mga pinakamatandang miyembro ng Java Collection Framework. Ito ay isang pagpapatupad ng mathematical hash table data structure. Sa Java hashtable panloob na naglalaman ng mga bucket kung saan ang key/value pares ay naka-imbak. Ang Hashtable ay medyo katulad ng HashMap . Ang pinaka makabuluhang pagkakaiba sa pagitan nila: Ang Hashtable ay naka-synchronize habang ang HashMap ay hindi.

Hashtable bilang istraktura ng data

Ang Hashtable ay isang istraktura ng data kung saan iniimbak ang data sa isang format ng array. Ang bawat value ng data ay may natatanging key value. Kung ang susi ay kilala, ang pag-access sa kinakailangang data ay napakabilis. Kaya, ang mga pagpapatakbo ng pagpapasok at paghahanap ay mabilis nang nakapag-iisa sa laki ng data. Ang Hash Table ay binubuo ng isang array upang panatilihin ang data at pag-hash para sa pagbuo ng isang index kung saan dapat matatagpuan ang isang elemento. Ano ang hashing? Ito ay isang panuntunan na nagmamapa ng Bagay sa isang hanay ng mga character (code). Karaniwan ang ganitong uri ng function ay nagko-convert ng isang malaking piraso ng data sa isang maliit na halaga ng integer. Maaaring iba ang mga function ng hash, ngunit lahat sila ay nagsusumite ng ilang partikular na katangian:
  • Ang isang partikular na bagay ay may partikular na hash code.
  • Ang dalawang magkaparehong bagay ay may parehong hash code. Ang kabaligtaran ay hindi totoo.
  • Kung magkaiba ang dalawang hash code, tiyak na hindi pantay ang mga bagay.
  • Maaaring may parehong hash code ang iba't ibang bagay. Ang napakabihirang pangyayaring ito ay tinatawag na banggaan. Ang magandang hash function ay nagpapaliit sa posibilidad ng mga banggaan.
Ang resulta ng paglalapat ng Hash Function sa isang Bagay ay tumatawag ng hashCode .

Hashtable sa Java

Ang klase ng Hashtable ay ang pagpapatupad ng istraktura ng data ng hash table. Ang koleksyong ito ay ginawa nang mas maaga kaysa sa Java Collection Framework, ngunit kalaunan ay isinama dito. Tulad ng lahat ng "maagang" mga koleksyon (mula sa Java 1.0), ang isang hashtable ay naka-synchronize (halos lahat ng mga pamamaraan ay minarkahan bilang naka-synchronize). Dahil sa kadahilanang ito, ang hashtable ay may malalaking problema sa pagganap. Samakatuwid, simula sa Java 1.2, sa karamihan ng mga kaso, inirerekomenda na gumamit ng iba pang mga pagpapatupad ng interface ng Map dahil sa kanilang kakulangan ng pag-synchronize. Karaniwan ang HashMap ang pinakaangkop na kapalit. Kaya Class Hashtable<K,V>binubuo ng mga susi at halaga. Nag-iimbak ito ng mga susi sa prinsipyo ng hashing. Ang mga pares ng key-value ay naka-store sa "mga bucket". Ang mga balde na magkasama ay bumubuo ng isang "talahanayan", isang uri ng panloob na hanay. Ginagamit ng Hashtable ang hashcode ng key upang matukoy ang isang bucket kung saan dapat imapa ang pares ng key/halaga. Hinahayaan ng hash function na makakuha ng bucket location mula sa hashcode ng Key. Ang function na ito ay nagbabalik ng isang integer na numero para sa isang bagay. Tulad ng sinabi namin sa itaas, ang dalawang pantay na bagay ay may parehong hashcode, habang ang dalawang hindi pantay na bagay ay maaaring hindi palaging may magkaibang hashcode. Ang iba't ibang mga bagay, na inilagay sa isang hashtable ay maaaring may parehong hash code. Upang malutas ang problemang ito (bangga) ang hanay ng mga listahan ay ginagamit sa hashtable. Ang mga pares na naka-map sa isang bucket ay naka-imbak sa isang listahan at ang listahan ng reference na ito ay naka-imbak sa array index.

Hashtable Java Constructors

  • Hashtable() , ang default na constructor. Lumilikha ito ng walang laman na hashtable. (Default na paunang kapasidad = 11, load factor =0.75).
  • Ang Hashtable(int size) ay gumagawa ng hashtable ng tinukoy na laki.
  • Ang Hashtable(int size, float fillRatio) ay lumilikha ng hash table ng tinukoy na laki at fill ratio.
  • Ang Hashtable(Map m) ay lumilikha ng hashtable na may parehong mga pagmamapa gaya ng ibinigay na Map.

Hashtable na Deklarasyon

Ang klase ng Hashtable Java ay nagpapatupad ng Map , Cloneable at Serializable na mga interface. Pinapalawak nito ang klase ng Dictionary .

Hashtable.java
public class Hashtable<K,V>
    extends Dictionary<K,V>
    implements Map<K,V>, Cloneable, java.io.Serializable
Ang K ay ang uri ng mga susi na pinananatili ng mapa. Ang V ay ang uri ng mga nakamapang halaga. Halimbawa:

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

Paano mag-import ng hashtable java

Ang Java Hashtable ay nasa loob ng java.util package. Kaya gumamit ng import java.util.Hashtable; sa iyong code. Kadalasan ay makakakuha ka ng pahiwatig mula sa iyong IDE tungkol dito.

Mga pangunahing operasyon ng Hashtable

Ang mga pangunahing operasyon ng Hashtable ay pagkuha, pagpasok sa koleksyon at pag-alis mula doon. Narito ang tatlong operasyong ito:
  • Ang Object get(Object key) ay nagbabalik ng halaga ng Object na may tinukoy na key. Ibinabalik ang null kung walang nakitang ganoong key.
  • Ang Object put(Object key, Object value) ay nagmamapa ng tinukoy na key sa tinukoy na halaga. Hindi maaaring null ang susi o ang halaga.
  • Object remove(Object key) inaalis ang entry (key at kaukulang halaga) mula sa hashtable.
Ang iba pang mahahalagang operasyon:
  • int size() ay nagbabalik ng dami ng mga entry sa hash table.
  • Ang boolean ay naglalaman ng(Object value) sinusuri kung ang tinukoy na halaga ay nasa hash table. Kung gayon, ang pamamaraan ay nagbabalik ng totoo, kung hindi ay nagbabalik ng mali.
  • Ang boolean containsValue(Object value) ay sumusuri kung ang tinukoy na halaga ay nasa hash table. Kung gayon, ang pamamaraan ay nagbabalik ng totoo, kung hindi ay nagbabalik ng mali.
  • inaalis ng void clear() ang lahat ng mga entry mula sa hashtable.
  • Ang boolean containsKey(Object key) ay nagbabalik ng true kung ang tinukoy na key ay umiiral sa hash table, kung hindi, ibabalik ang false.
  • Ang boolean isEmpty() ay nagbabalik ng true kung ang hashtable ay walang laman o false kung naglalaman ito ng kahit isang key.
  • pinapataas ng void rehash() ang laki ng hashtable at nire-rehashes ang lahat ng key nito.

Pagpapatupad ng hash table, Java code:

Gumawa tayo ng klase ng Mag-aaral :

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));
   }
}
Narito ang halimbawa ng Java Hashtable . Maglagay tayo ng dalawang Object ng klase ng Mag-aaral sa hashtable, pagkatapos ay alisin ang ilan at suriin ang ilang mga parameter.

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));
   }
}
Ang resulta ng pagpapatakbo ng programa ay:

1
false
2
true
true
false
true

HashMap kumpara sa Hashtable

  • Ang Hashtable ay katulad ng HashMap sa Java. Ang pinaka makabuluhang pagkakaiba ay ang Hashtable ay naka-synchronize habang ang HashMap ay hindi. Samakatuwid, ang Hashtable ay mas mabagal kaysa sa HashMap dahil sa pag-synchronize.
  • Maliban sa problema sa pag-synchronize, hindi pinapayagan ng Hashtable na gamitin ang null bilang value o key. Ang HashMap ay nagbibigay-daan sa isang null key at maramihang mga null value.
  • Ang Hashtable ay namamana ng klase ng Dictionary habang ang HashMap ay namamana ng klase ng AbstractMap.
  • Ang HashMap ay dinadaanan ng Iterator. Ang Hashtable ay maaaring madaanan hindi lamang ng Iterator kundi pati na rin ng Enumerator.

Halimbawa ng hashtable ng Java (Hashtable vs HashMap null key)

Narito ang isang fragment code upang ipakita ang isang null na ginamit bilang isang susi at halaga sa HashMap at 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");
  }
Ang resulta ng pagpapatakbo ng program na naglalaman ng fragment na ito:

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

Konklusyon

Hindi mo talaga madalas na gagamit ng Hashtable sa mga totoong proyekto, ngunit madaling matugunan ang istruktura ng data na ito sa mga lumang proyekto. Gayunpaman, mahalagang maunawaan kung ano ang mayroon ang Data Structures Java at kung paano gumagana ang mga ito, kahit man lang para sa iyong mga panayam. Karaniwang ginagamit ang mga bagay na HashMap sa halip na Hashtable dahil sa kanilang pagkakapareho. Ang HashMap ay mas epektibo (hindi ito naka-synchronize) at maaaring magkaroon ng null bilang isang susi.
Mga komento
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION