2012-08-16 17 views
22

Jak określono w dokumentacji JDK, Hashtable nie zezwala na puste klucze ani wartości. HashMap zezwala na jeden pusty klucz i dowolną liczbę wartości pustych. Dlaczego to?Dlaczego Hashtable nie zezwala na puste klucze lub wartości?

+0

ponieważ klucza nie można powielić na pojedynczej mapie. –

+2

Może ta [odpowiedź] (http://stackoverflow.com/a/7556445/579828) ci pomoże. – Vic

+4

Hashtable chce egzekwować umowę w ten sposób. Ta umowa zapewnia, że ​​metoda get (.) Zastosowana do zmiennej hashtable zwróci wartość null wtedy i tylko wtedy, gdy klucz nie znajduje się na mapie. –

Odpowiedz

28

Hashtable to starsza klasa, a jej stosowanie jest ogólnie odradzane. Być może widzieli potrzebę klucza zerowego, a co ważniejsze - wartości zerowych i dodali go w implementacji HashMap.

HashMap jest nowszy i ma bardziej zaawansowane możliwości, które są po prostu ulepszeniem funkcjonalności HashTable. Po utworzeniu HashMap został specjalnie zaprojektowany do obsługi wartości pustych jako kluczy i obsługuje je jako specjalny przypadek.

Edit

Od HashtableJavaDoc:

Aby skutecznie przechowywania i pobierania obiektów z hashtable, że przedmioty używane jako klucze musi implementować metodę hashCode i metody równymi.

Od null nie jest przedmiotem, nie można nazwać .equals() lub .hashCode() na nim, więc Hashtable nie może obliczyć hash do użycia go jako klucza.

+15

[ 'ConcurrentHashMap'] (http: //docs.oracle.com/javase/7/docs/api/java/util/concurrent/ConcurrentHashMap.html) jest nowszą klasą, ale ma również ograniczenie nie dopuszczania pustych kluczy ani wartości. Dodają to ograniczenie ze względów wydajnościowych, ponieważ jest to bardzo dużo pracy nad obsługą pustych kluczy i wartości, ale prawdopodobnie nie jest to przydatne w większości przypadków. – DaoWen

+0

Od odpowiedzi oczekiwałem przyczyny, dla której Hashtable nie zezwala na puste klucze lub wartości? Chociaż sugerujesz nowszy i starszy. –

3

Ponieważ w HashTable, gdy umieścisz element, weźmie pod uwagę wartość klucza i wartości hash. Zasadniczo trzeba będzie coś takiego:

public Object put(Object key, Object value){ 

key.hashCode(); 

etc... 

value.hashCode(); 

} 

natomiast w HashMap jeśli jest zerowa będzie obliczyć klucz według wartości. Nadal osobiście nie lubię dodawać wpisu klucza null.

2

Powód jest powodem przyjętej odpowiedzi: Hashtable jest stara.

Jednak użycie HashTable NIE zniechęca się na korzyść HashMap w każdym scenariuszu.

  • Hashtable jest zsynchronizowany, więc jest THREAD-SAFE. HashMap nie jest.

Ani Hashtable ani ConcurrentHashMap nie obsługują kluczy ani wartości null. HashMap ma.

Jeśli chcesz zastąpić drop-in, który nie wymaga niczego innego niż zmiana klasy i działa w każdym scenariuszu, nie ma żadnego. Najbardziej podobna opcja byłaby ConcurrentHashMap (co jest bezpieczeństwo wątków, ale nie obsługuje blokowania całej tabeli):

Klasa ta jest w pełni współpracuje z Hashtable w programach, które opierają się na jego bezpieczeństwo wątku, ale nie na jego synchronizacji Detale.

HashMap jest lepszym zamiennikiem dla aplikacji z jednym gwintem lub synchronizacja czasu nie jest wymagana, ponieważ wprowadza synchronizację wpływu na wydajność.

Źródła:

+0

Umieszczenie ConcurrentHashMap: mapuje określony klucz na określoną wartość w tej tabeli. Ani klucz, ani wartość nie mogą być puste. Sprawdź swoją odpowiedź. –

+0

oops! Dziękuję za wzloty! Poszedłem na oczywiste i myślałem, że jedyną różnicą między ConcurrentHashMap i HashMap było bezpieczeństwo wątków. Nie pierwszy raz, kiedy to się stało. Co za konwencja akward nazewnictwa! – NotGaeL

-1

HashTable - nie zezwala na klucze zerowe
To dlatego, że w Put (klawisz K, wartość V) metoda, mamy key.hashcode() które th wiersze zerowy wskaźnik wyjątku.
HashTable - nie pozwalają wartość zerowa
To dlatego, że w Put (klawisz K, napięcie V) Metoda mamy if(value==null){throw new NullPointerException

HashMap zezwala na wartości null, ponieważ nie ma żadnych czeków jak HashTable, natomiast dopuszcza tylko jeden klucz zerowy. Odbywa się to za pomocą metody putForNullKey, które dodają wartości do 0th indeksu tablicy wewnętrznej każdym razem kluczem jest jako wartość null

+0

Nazwa klasy to java.util.Hashtable, a nie "HashTable"! –

0

więc zawrzeć

Ponieważ w HashTable kiedy można umieścić element it weźmie pod uwagę klucz i wartość hash. Zasadniczo trzeba będzie coś takiego:

public Object put(Object key, Object value){ 

    key.hashCode(); 

    //some code 

    value.hashCode(); 

} 

HashTable - nie pozwala na klucze null To dlatego, że w Put (klawisz K, wartość V) metoda, mamy key.hashcode(), która rzuca wyjątku null pointer. HashTable - nie pozwalają wartość null To dlatego, że w put (klawisz K, wartość V) metodą mamy if (value == null) {throw new NullPointerException

HashMap zezwala na wartości null, ponieważ nie ma wszelkie sprawdzenia, takie jak HashTable, podczas gdy zezwala tylko na jeden klucz zerowy. Odbywa się to za pomocą metody putForNullKey, które dodają wartości do 0th indeksu tablicy wewnętrznej każdym razem kluczem jest przewidziany jako NULL

0

tablica mieszająca jest bardzo stara klasa, z JDK 1.0

Aby zrozumieć to przede wszystkim musimy zrozumieć komentarze napisane na tej klasie przez autora. "Ta klasa implementuje hashtable, która mapuje klucze do wartości. Każdy obiekt inny niż NULL może być użyty jako klucz lub jako wartość. Aby skutecznie przechowywania i pobierania obiektów z hashtable, przedmioty używane jako klucze musi implementować metodę hashCode i metody równych sobie.”

HashTable klasy jest realizowany na mechanizm mieszania, że ​​to znaczy, aby przechowywać dowolną parę klucz-wartość, wymagany kod skrótu dla klucza obiektu. Jeśli klucz byłby wartością null, nie będzie w stanie podać wartości mieszania, będzie to spowodowane przez wyjątek wskaźnika pustego i podobny przypadek dla wartości , jeśli null ma wartość null.

Ale później okazało się, że klucz i wartość pusta ma swoje własne znaczenie, to jest , dlaczego jeden pusty klucz i wiele wartości null są dozwolone w później zaimplementowanych klasach, takich jak klasa HashMap.

Dla mapy mieszania dozwolone są klucze puste i istnieje zerowa kontrola dla kluczy , jeśli klucz jest zerowy, to element będzie przechowywany w lokalizacji zerowej w tablicy wpisów. null key możemy użyć dla pewnej wartości domyślnej ..

=> metody HashTable są zsynchronizowane neveruses to obiekt blokujące opierają.

HashMap realizuje rozważając to specjalny

static final int hash(Object key) { 
     int h; 
     return (key == null) ? 0 : (h = key.hashCode())^(h >>> 16); 
    } 

Java 8 nie można wywnioskować typy na tablicy mieszającej.

private Map<String,String> hashtable = new Hashtable<>(); // Not Allowed 

private Map<String,String> hashtable = new HashMap<>(); // Allowed 
Powiązane problemy