„HashMap“ ir „Hashtable“ palyginimas „Java“: pagrindiniai skirtumai ir efektyvumas

„HashMap“ ir „Hashtable“ palyginimas „Java“: pagrindiniai skirtumai ir efektyvumas
Java

„HashMap“ ir „Hashtable“ supratimas „Java“.

Java“ kolekcijų pasaulyje „HashMap“ ir „Hashtable“ yra dvi plačiai naudojamos duomenų struktūros, skirtos raktų ir reikšmių poroms saugoti. Nors jie gali atrodyti panašūs, jie turi ryškių skirtumų, kurie gali turėti įtakos jūsų programos veikimui ir gijų saugai. Šių skirtumų supratimas yra labai svarbus norint pasirinkti tinkamą jūsų poreikius.

Šiame straipsnyje nagrinėjami pagrindiniai „HashMap“ ir „Hashtable“ skirtumai, nagrinėjamos jų funkcijos, efektyvumas ir tinkamumas ne gijų programoms. Pabaigoje turėsite aiškesnį supratimą, kokią duomenų struktūrą naudoti konkrečiu atveju.

komandą apibūdinimas
HashMap.put() Įterpia rakto-reikšmių porą į HashMap. Leidžia nulinius raktus ir reikšmes.
Hashtable.put() Įterpia rakto-reikšmių porą į maišos lentelę. Neleidžiama naudoti nulinių raktų ar reikšmių.
System.nanoTime() Grąžina esamą veikiančio Java virtualiosios mašinos didelės raiškos laiko šaltinio vertę nanosekundėmis.
try { ... } catch (NullPointerException e) Bando vykdyti kodą ir sugauna visas NullPointerExceptions, tvarkydamas atvejus, kai Hashtable.put() iškviečiamas nulinėmis reikšmėmis.
HashMap.get() Iš HashMap nuskaito vertę, susietą su nurodytu raktu.
Hashtable.get() Nuskaito reikšmę, susietą su nurodytu raktu iš maišos lentelės.

Giliai pasinerkite į „HashMap“ ir „Hashtable“ diegimą

Pirmasis scenarijus suteikia tiesioginį palyginimą tarp HashMap ir Hashtable Java kalboje. Scenarijus pradedamas importuojant reikiamas klases ir sukuriant abiejų duomenų struktūrų egzempliorius. A HashMap yra kartojamas ir užpildytas rakto-reikšmių poromis. Panašiai, a Hashtable yra sukurtas ir apgyvendintas. Tada šis scenarijus parodo esminį nulinių reikšmių tvarkymo skirtumą. HashMap.put() leidžia be problemų įterpti nulines reikšmes, tuo tarpu Hashtable.put() meta a NullPointerException jei bandoma pridėti nulinius raktus arba reikšmes. The try { ... } catch (NullPointerException e) Šiam elgesiui iliustruoti naudojami blokai. Scenarijus padeda kūrėjams suprasti, kada ir kodėl renkantis iš šių dviejų duomenų struktūrų reikia atsižvelgti į nulines reikšmes.

Antrasis scenarijus skirtas našumo testavimui HashMap ir Hashtable aplinkoje, kurioje nėra sriegių. Jis pradedamas inicijuojant abu žemėlapius ir išmatuojant laiką, per kurį įterpiama milijonas raktų-reikšmių porų naudojant System.nanoTime(). Šis didelės raiškos laiko matavimas padeda tiksliai užfiksuoti operacijos laiką. Rezultatai atspausdinami į konsolę, nurodant santykinį našumą. Scenarijus taip pat matuoja to paties raktų rinkinio gavimo laiką iš abiejų duomenų struktūrų. Palyginus šiuos laikus, kūrėjai gali įvertinti, kuri duomenų struktūra veikia geriau ne gijų programose. Šis scenarijus ypač naudingas norint reguliuoti našumą ir suprasti su tuo susijusias pridėtines išlaidas Hashtable dėl sinchronizuotų metodų.

„HashMap“ ir „Hashtable“ palyginimas: pagrindiniai skirtumai ir naudojimo atvejai

Java diegimas palyginimui

import java.util.HashMap;
import java.util.Hashtable;

public class MapComparison {
    public static void main(String[] args) {
        // Creating a HashMap
        HashMap<String, String> hashMap = new HashMap<>();
        hashMap.put("1", "One");
        hashMap.put("2", "Two");
        hashMap.put("3", "Three");

        // Creating a Hashtable
        Hashtable<String, String> hashtable = new Hashtable<>();
        hashtable.put("A", "Apple");
        hashtable.put("B", "Banana");
        hashtable.put("C", "Cherry");

        // Displaying the HashMap
        System.out.println("HashMap: " + hashMap);

        // Displaying the Hashtable
        System.out.println("Hashtable: " + hashtable);

        // Checking for null values
        try {
            hashMap.put(null, "NullValue");
            System.out.println("HashMap allows null values: " + hashMap);
        } catch (NullPointerException e) {
            System.out.println("HashMap does not allow null values");
        }
        try {
            hashtable.put(null, "NullValue");
            System.out.println("Hashtable allows null values: " + hashtable);
        } catch (NullPointerException e) {
            System.out.println("Hashtable does not allow null values");
        }
    }
}

HashMap vs. Hashtable: našumas vienos gijos aplinkose

„Java“ našumo tikrinimas ne sriegiams skirtoms programoms

import java.util.HashMap;
import java.util.Hashtable;

public class PerformanceTest {
    public static void main(String[] args) {
        // Initializing the maps
        HashMap<Integer, Integer> hashMap = new HashMap<>();
        Hashtable<Integer, Integer> hashtable = new Hashtable<>();

        // Adding elements to HashMap
        long startTime = System.nanoTime();
        for (int i = 0; i < 1000000; i++) {
            hashMap.put(i, i);
        }
        long endTime = System.nanoTime();
        System.out.println("HashMap time: " + (endTime - startTime) + " ns");

        // Adding elements to Hashtable
        startTime = System.nanoTime();
        for (int i = 0; i < 1000000; i++) {
            hashtable.put(i, i);
        }
        endTime = System.nanoTime();
        System.out.println("Hashtable time: " + (endTime - startTime) + " ns");

        // Retrieving elements from HashMap
        startTime = System.nanoTime();
        for (int i = 0; i < 1000000; i++) {
            hashMap.get(i);
        }
        endTime = System.nanoTime();
        System.out.println("HashMap retrieval time: " + (endTime - startTime) + " ns");

        // Retrieving elements from Hashtable
        startTime = System.nanoTime();
        for (int i = 0; i < 1000000; i++) {
            hashtable.get(i);
        }
        endTime = System.nanoTime();
        System.out.println("Hashtable retrieval time: " + (endTime - startTime) + " ns");
    }
}

HashMap ir Hashtable: sinchronizavimas ir gijų sauga

Vienas iš pagrindinių skirtumų tarp HashMap ir Hashtable yra jų požiūris į sinchronizavimą ir siūlų saugumą. Hashtable yra sinchronizuotas, tai reiškia, kad jis yra saugus gijų ir gali būti bendrinamas tarp kelių gijų nesukeliant lygiagretumo problemų. Šis sinchronizavimas pasiekiamas sinchronizuojant daugumą jo metodų, o tai užtikrina, kad tik viena gija gali pasiekti Hashtable bet kuriuo metu. Tačiau tai taip pat padidina efektyvumą dėl fiksavimo mechanizmo Hashtable lėčiau, palyginti su HashMap vienos gijos scenarijuose.

Priešingai, HashMap nėra sinchronizuotas ir todėl nėra saugus siūlams. Jeigu HashMap vienu metu pasiekiama keliomis gijomis, kyla duomenų nenuoseklumo ir lenktynių sąlygų rizika. Norėdami pagaminti a HashMap saugus siūlams, kūrėjai gali naudoti Collections.synchronizedMap() Norėdami apvynioti jį sinchronizuotame žemėlapyje, arba jie gali naudoti ConcurrentHashMap klasė įdiegta Java 1.5 versijoje, kuri užtikrina geresnį našumą, leisdama vienu metu pasiekti skirtingas žemėlapio dalis. Tai daro ConcurrentHashMap efektyvesnis pasirinkimas tuo pačiu metu veikiančioms programoms.

Dažnai užduodami klausimai apie HashMap ir Hashtable

  1. Koks yra pagrindinis skirtumas tarp HashMap ir Hashtable?
  2. HashMap nėra sinchronizuotas ir leidžia nulinius raktus bei reikšmes, o Hashtable yra sinchronizuotas ir neleidžia naudoti nulinių raktų ar reikšmių.
  3. Kuris iš jų yra greitesnis vienos gijos aplinkoje?
  4. HashMap paprastai yra greitesnis vienos gijos aplinkoje dėl sinchronizavimo trūkumo.
  5. Kaip padaryti „HashMap“ giją saugų?
  6. Naudojant Collections.synchronizedMap() apvynioti HashMap arba naudojant ConcurrentHashMap.
  7. Ar „Hashtable“ gali saugoti nulinius raktus arba reikšmes?
  8. ne, Hashtable neleidžia naudoti nulinių raktų ar reikšmių ir išmes a NullPointerException jei bandoma.
  9. Kada turėtumėte naudoti „Hashtable“ per „HashMap“?
  10. Naudokite Hashtable kai reikalinga gijų sauga ir jums nerūpi sinchronizavimo našumas.
  11. Ar „ConcurrentHashMap“ yra geresnė „Hashtable“ alternatyva?
  12. taip, ConcurrentHashMap užtikrina geresnį lygiagretumą ir našumą, palyginti su Hashtable.
  13. Kodėl „HashMap“ nėra saugus nuo gijų?
  14. HashMap sukurtas vienos gijos scenarijams ir neapima sinchronizavimo mechanizmų.
  15. Kaip „HashMap“ ir „Hashtable“ tvarko susidūrimus?
  16. Abu HashMap ir Hashtable tvarkyti susidūrimus naudojant grandininę funkciją, kai kiekviename segmente yra susietas įrašų sąrašas.

Paskutinės mintys apie HashMap ir Hashtable

HashMap“ ir „Hashtable“ naudojami panašiems tikslams saugoti raktų ir verčių poras, tačiau jų požiūris į sinchronizavimą ir našumą labai skiriasi. „HashMap“ yra teikiama pirmenybė ne gijų programoms dėl savo greičio ir lankstumo su nulinėmis reikšmėmis. Ir atvirkščiai, „Hashtable“ tinka operacijoms, kurios yra saugios, tačiau už našumą. Suprasdami šiuos skirtumus, kūrėjai gali priimti pagrįstus sprendimus, kokią duomenų struktūrą naudoti, atsižvelgdami į savo specifinius reikalavimus.