A HashMap és a Hashtable megértése Java nyelven
A Java-gyűjtemények világában a HashMap és a Hashtable két széles körben használt adatstruktúra kulcs-érték párok tárolására. Bár hasonlónak tűnhetnek, vannak különbségek, amelyek hatással lehetnek az alkalmazás teljesítményére és a szálak biztonságára. Ezeknek a különbségeknek a megértése alapvető fontosságú az igényeinek megfelelő kiválasztásához.
Ez a cikk a HashMap és a Hashtable közötti főbb különbségeket kutatja, feltárva funkcióikat, hatékonyságukat és a nem szálas alkalmazásokhoz való alkalmasságukat. A végére egyértelműbb elképzelése lesz arról, hogy az adott felhasználási esetben melyik adatstruktúrát használja.
Parancs | Leírás |
---|---|
HashMap.put() | Kulcs-érték párt szúr be a HashMap-be. Lehetővé teszi a null kulcsokat és értékeket. |
Hashtable.put() | Kulcs-érték párt szúr be a Hashtable-ba. Nem engedélyezi a null kulcsokat vagy értékeket. |
System.nanoTime() | A futó Java virtuális gép nagy felbontású időforrásának aktuális értékét adja vissza nanoszekundumban. |
try { ... } catch (NullPointerException e) | Megpróbálja végrehajtani a kódot, és elkap minden NullPointerExceptiont, kezelve azokat az eseteket, amikor a Hashtable.put() null értékekkel kerül meghívásra. |
HashMap.get() | Lekéri a megadott kulcshoz tartozó értéket a HashMap-ről. |
Hashtable.get() | Lekéri a megadott kulcshoz tartozó értéket a hashtable-ból. |
Merüljön el mélyebben a HashMap és a Hashtable megvalósításban
Az első szkript közvetlen összehasonlítást biztosít a között és Java nyelven. A szkript a szükséges osztályok importálásával és mindkét adatstruktúra példányának létrehozásával kezdődik. A példányosodik és kulcs-érték párokkal van feltöltve. Hasonlóan, a Hashtable létrejön és benépesül. Ez a szkript ezután bemutatja a null értékek kezelésének alapvető különbségét. lehetővé teszi null értékek beszúrását probléma nélkül, míg dob a ha null kulcsokat vagy értékeket próbál meg hozzáadni. A try { ... } catch (NullPointerException e) blokkokat használnak ennek a viselkedésnek a szemléltetésére. A szkript segít a fejlesztőknek megérteni, mikor és miért kell a null értékeket figyelembe venni a két adatstruktúra közötti választás során.
A második szkript a teljesítmény tesztelésére összpontosít és nem szálas környezetben. Kezdje mindkét leképezés inicializálásával, és megméri, hogy mennyi időbe telik millió kulcs-érték pár beillesztéséhez. . Ez a nagy felbontású időmérés segít a műveletekhez szükséges pontos idő rögzítésében. Az eredményeket a rendszer kinyomtatja a konzolra, megmutatva a relatív teljesítményt. A szkript méri a lekérési időt is ugyanazon kulcskészlethez mindkét adatstruktúrából. Ezen idők összehasonlításával a fejlesztők felmérhetik, melyik adatstruktúra teljesít jobban a nem szálas alkalmazásokban. Ez a szkript különösen hasznos a teljesítmény hangolásához és a kapcsolódó általános költségek megértéséhez Hashtable szinkronizált módszerei miatt.
A HashMap és a Hashtable összehasonlítása: alapvető különbségek és használati esetek
Java implementáció összehasonlítás céljából
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: Teljesítmény egyszálú környezetekben
Java teljesítményteszt nem szálas alkalmazásokhoz
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 és Hashtable: Szinkronizálás és szálbiztonság
Az egyik legfontosabb különbség között és ez a megközelítésük a szinkronizáláshoz és a menetbiztonsághoz. szinkronizált, ami azt jelenti, hogy szálbiztos, és több szál között megosztható anélkül, hogy párhuzamossági problémákat okozna. Ezt a szinkronizálást a legtöbb módszer szinkronizálásával érik el, ami biztosítja, hogy egy adott időpontban csak egy szál férhessen hozzá a Hashtable-hoz. Ez azonban a reteszelő mechanizmus miatti teljesítményt is növeli Hashtable -hoz képest lassabb egyszálú forgatókönyvekben.
Ellentétben, nincs szinkronizálva, ezért nem szálbiztos. Ha egy több szál is eléri egyszerre, fennáll az adatok inkonzisztenciájának és a versenyfeltételeknek a veszélye. Ahhoz, hogy a szálbiztos, használhatják a fejlesztők Collections.synchronizedMap() szinkronizált térképbe csomagolni, vagy használhatják a A Java 1.5-ben bevezetett osztály, amely jobb teljesítményt biztosít azáltal, hogy lehetővé teszi a térkép különböző részeihez való egyidejű hozzáférést. Ez teszi hatékonyabb választás egyidejű alkalmazásokhoz.
- Mi a fő különbség a HashMap és a Hashtable között?
- nincs szinkronizálva, és engedélyezi a null kulcsokat és értékeket, míg szinkronizált, és nem engedélyezi a null kulcsokat vagy értékeket.
- Melyik a gyorsabb egyszálú környezetben?
- általában gyorsabb egyszálú környezetben a szinkronizálási overhead hiánya miatt.
- Hogyan lehet egy HashMap-et szálbiztossá tenni?
- Használva becsomagolni a vagy használatával .
- A Hashtable tárolhat null kulcsokat vagy értékeket?
- Nem, nem engedélyezi a null kulcsokat vagy értékeket, és a ha megkísérelték.
- Mikor érdemes a Hashtablet használni a HashMap helyett?
- Használat amikor szálbiztonságra van szükség, és nem aggódik a szinkronizálás teljesítménye miatt.
- A ConcurrentHashMap jobb alternatíva a Hashtable-hez?
- Igen, -hoz képest jobb párhuzamosságot és teljesítményt biztosít .
- Miért nem szálbiztos a HashMap?
- egyszálú forgatókönyvekhez készült, és nem tartalmaz szinkronizálási mechanizmusokat.
- Hogyan kezeli a HashMap és a Hashtable az ütközéseket?
- Mindkét és az ütközéseket láncolással kezeli, ahol minden egyes gyűjtőzóna a bejegyzések összekapcsolt listáját tartalmazza.
A HashMap és a Hashtable hasonló célokat szolgál a kulcs-érték párok tárolásában, de jelentősen eltérnek egymástól a szinkronizálás és a teljesítmény tekintetében. A HashMap előnyben részesítendő a nem szálas alkalmazásokhoz, gyorsasága és nullértékekkel való rugalmassága miatt. Ezzel szemben a Hashtable alkalmas szálbiztos műveletekre, de a teljesítmény árán. E különbségek megértésével a fejlesztők megalapozott döntéseket hozhatnak arról, hogy milyen adatstruktúrát használjanak sajátos követelményeik alapján.