Pochopení HashMap a Hashtable v Javě
Ve světě Java kolekcí jsou HashMap a Hashtable dvě široce používané datové struktury pro ukládání párů klíč-hodnota. I když se mohou zdát podobné, mají výrazné rozdíly, které mohou ovlivnit výkon vaší aplikace a bezpečnost vláken. Pochopení těchto rozdílů je zásadní pro výběr toho správného pro vaše potřeby.
Tento článek se ponoří do klíčových rozdílů mezi HashMap a Hashtable a zkoumá jejich funkce, efektivitu a vhodnost pro aplikace bez vláken. Na konci budete mít jasnější představu o tom, jakou datovou strukturu použít ve vašem konkrétním případě použití.
Příkaz | Popis |
---|---|
HashMap.put() | Vloží pár klíč–hodnota do HashMap. Umožňuje nulové klíče a hodnoty. |
Hashtable.put() | Vloží pár klíč–hodnota do hashtable. Nepovoluje nulové klíče nebo hodnoty. |
System.nanoTime() | Vrátí aktuální hodnotu zdroje času s vysokým rozlišením běžícího virtuálního stroje Java v nanosekundách. |
try { ... } catch (NullPointerException e) | Pokusí se spustit kód a zachytí všechny výjimky NullPointerExceptions, zpracuje případy, kdy je volána Hashtable.put() s hodnotami null. |
HashMap.get() | Načte hodnotu spojenou se zadaným klíčem z HashMap. |
Hashtable.get() | Načte hodnotu spojenou se zadaným klíčem z hashtable. |
Hluboký ponor do implementace HashMap a Hashtable
První skript poskytuje přímé srovnání mezi a v Javě. Skript začíná importem potřebných tříd a vytvořením instancí obou datových struktur. A je vytvořena instance a naplněna páry klíč–hodnota. Podobně a Hashtable je vytvořen a osídlen. Tento skript pak demonstruje zásadní rozdíl ve zpracování hodnot null. umožňuje vkládat hodnoty null bez problémů, zatímco hází a pokud se pokusíte přidat nulové klíče nebo hodnoty. The try { ... } catch (NullPointerException e) Pro ilustraci tohoto chování se používají bloky. Skript pomáhá vývojářům pochopit, kdy a proč se při výběru mezi těmito dvěma datovými strukturami berou v úvahu hodnoty null.
Druhý skript se zaměřuje na testování výkonu a v prostředí bez vláken. Začíná inicializací obou map a měřením času potřebného k vložení milionu párů klíč-hodnota pomocí . Toto měření času s vysokým rozlišením pomáhá zachytit přesný čas potřebný pro operace. Výsledky jsou vytištěny na konzole a ukazují relativní výkon. Skript také měří čas načítání pro stejnou sadu klíčů z obou datových struktur. Porovnáním těchto časů mohou vývojáři změřit, která datová struktura funguje lépe v aplikacích bez vláken. Tento skript je zvláště užitečný pro ladění výkonu a pochopení související režie Hashtable díky jeho synchronizovaným metodám.
Porovnání HashMap a Hashtable: Základní rozdíly a případy použití
Implementace Java pro srovnání
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: Výkon v prostředí s jedním vláknem
Testování výkonu Java pro aplikace bez vláken
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 a Hashtable: Synchronizace a bezpečnost vláken
Jedním z klíčových rozdílů mezi a je jejich přístup k synchronizaci a bezpečnosti vláken. je synchronizovaný, což znamená, že je bezpečný pro vlákna a může být sdílen mezi více vlákny, aniž by způsoboval problémy se souběžností. Této synchronizace je dosaženo synchronizací většiny jeho metod, což zajišťuje, že k Hashtable může v daný okamžik přistupovat pouze jedno vlákno. To však také představuje výkonovou režii kvůli uzamykacímu mechanismu Hashtable pomalejší ve srovnání s v jednovláknových scénářích.
V porovnání, není synchronizovaný, a proto není bezpečný pro vlákna. Pokud přistupuje více vláken současně, existuje riziko nekonzistence dat a rasových podmínek. Chcete-li udělat a bezpečné pro vlákna, mohou vývojáři používat Collections.synchronizedMap() zabalit to do synchronizované mapy, nebo mohou použít třída zavedená v Javě 1.5, která poskytuje lepší výkon tím, že umožňuje souběžný přístup k různým částem mapy. To dělá efektivnější volba pro souběžné aplikace.
- Jaký je hlavní rozdíl mezi HashMap a Hashtable?
- není synchronizován a umožňuje nulové klíče a hodnoty je synchronizován a neumožňuje nulové klíče ani hodnoty.
- Který z nich je rychlejší v prostředí s jedním vláknem?
- je obecně rychlejší v prostředí s jedním vláknem kvůli nedostatku režie synchronizace.
- Jak můžete zajistit, aby HashMap byla bezpečná pro vlákna?
- Používáním zabalit nebo pomocí .
- Může Hashtable ukládat nulové klíče nebo hodnoty?
- Ne, nepovoluje nulové klíče nebo hodnoty a vyvolá a v případě pokusu.
- Kdy byste měli používat Hashtable přes HashMap?
- Použití když je vyžadována bezpečnost vlákna a nemáte obavy z režie výkonu synchronizace.
- Je ConcurrentHashMap lepší alternativou k Hashtable?
- Ano, poskytuje lepší souběžnost a výkon ve srovnání s .
- Proč není HashMap bezpečný pro vlákna?
- je určen pro scénáře s jedním vláknem a neobsahuje synchronizační mechanismy.
- Jak HashMap a Hashtable zvládají kolize?
- Oba a řešit kolize pomocí řetězení, kde každý kbelík obsahuje propojený seznam položek.
HashMap a Hashtable slouží podobným účelům při ukládání párů klíč-hodnota, ale výrazně se liší v přístupu k synchronizaci a výkonu. HashMap je preferován pro aplikace bez vláken díky své rychlosti a flexibilitě s hodnotami null. Naopak Hashtable je vhodný pro operace bezpečné pro vlákna, ale za cenu výkonu. Po pochopení těchto rozdílů mohou vývojáři činit informovaná rozhodnutí o tom, jakou datovou strukturu použít na základě svých specifických požadavků.