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?
Odpowiedz
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 Hashtable
JavaDoc:
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.
[ '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
Od odpowiedzi oczekiwałem przyczyny, dla której Hashtable nie zezwala na puste klucze lub wartości? Chociaż sugerujesz nowszy i starszy. –
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.
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:
Umieszczenie ConcurrentHashMap: mapuje określony klucz na określoną wartość w tej tabeli. Ani klucz, ani wartość nie mogą być puste. Sprawdź swoją odpowiedź. –
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
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
Nazwa klasy to java.util.Hashtable, a nie "HashTable"! –
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
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
- 1. Dopuszczalne typy używane jako klucze w HashTable
- 2. Dlaczego funkcja Task.Delay() zezwala na nieskończone opóźnienie?
- 3. ograniczenia typu Scala nie zezwala na wartości null
- 4. MongoDB nie zezwala na używanie "." w kluczu
- 5. Dlaczego Java nie zezwala na przeciążenia na podstawie parametrów typu?
- 6. C90 nie zezwala na użycie% lf w printf, dlaczego?
- 7. Jeśli JSON ma wartości puste
- 8. Dlaczego funkcja UIManager.getDefaults(). KeySet() zwraca różne wartości niż klucze UIManager.getDefaults().()?
- 9. Dlaczego hashtable przechowywania wartości hash klucza w tabeli w java
- 10. String wartości HashTable w PowerShell
- 11. KeyUsage nie zezwala na podpisy cyfrowe
- 12. Django @override_settings nie zezwala na słownik?
- 13. Dodaj klucze/wartości do słownika na deklaracji
- 14. Zamień puste ciągi na wartości Brak/puste w DataFrame
- 15. klucze PHP tablicy wartości
- 16. Firebase nie zbawi klucze z wartości null
- 17. Tablica PHP - Przekształcanie wartości tablic na klucze
- 18. QTableView - nie zezwala użytkownikowi na edycję komórki
- 19. sqlbulkcopy - nie zezwala na wartość DBNull.Value.?
- 20. Hashtable kolizja rehashing - jak czytać wartości?
- 21. accepts_nested_attributes_for zignorować puste wartości
- 22. Hashtable z roznych wartości dla pojedynczego klucza
- 23. Jak uzyskać wartości HashTable jako Arraylist?
- 24. Wyrażenie regularne, które zezwala tylko na znaki lub przestrzeń.
- 25. Brakujące elementy w żądaniu HTTP - puste lub puste?
- 26. Funkcje "puste" i "lub" na pustych listach
- 27. Czy w haasie mogą znajdować się zduplikowane klucze lub wartości?
- 28. Klasa obudowy Scala nie zezwala na parametry wywoławcze?
- 29. dlaczego są puste tablice numpy nie drukowane
- 30. Gson Serialize pole tylko jeśli nie jest puste lub nie puste
ponieważ klucza nie można powielić na pojedynczej mapie. –
Może ta [odpowiedź] (http://stackoverflow.com/a/7556445/579828) ci pomoże. – Vic
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. –