2012-03-02 23 views
20

To nie jest pytanie o różnice między Hashtable i HashMap. Rozumiem, że obiekt nie może przyjąć wartości klucza ani wartości, że jest zbieraniem synchronicznym i że używa nieco mniej pamięci niż .Kiedy należy używać tabeli HashTable zamiast HashMap

Zastanawiam się nad scenariuszami, w których bardziej odpowiednie byłoby użycie Hashtable zamiast HashMap.

+2

duplikat http://stackoverflow.com/questions/40471/differences-between-hashmap-and-hashtable –

+0

@MattWolfe Nie jest to duplikat tego pytania. To pytanie omija różnice. Znam różnice. Pytam o to, kiedy należy użyć jednego z nich. –

Odpowiedz

23

To nie jest pytanie o różnicach między Hashtable i HashMap

No to naprawdę ...

Zastanawiam o scenariuszach, w których byłoby bardziej stosowne używać Hashtable zamiast HashMap.

Właśnie kiedy chcesz różnice między dwoma:

  • Kiedy chcesz uruchomić na Java 1.1
  • Gdy chcesz każda operacja być zsynchronizowane (coraz państwu formularz bezpieczeństwa wątków, tak długo, jak nigdy go nie przerabiasz) iz jakiegoś powodu nie chcesz używać Collections.synchronizedMap przez HashMap
  • Kiedy nie chcesz aby móc przechowywać wartości null
  • Gdy pamięć jest rzeczywiście różnica istotna (dopiero po okazała jest to przypadek) - nie był nawet świadomy tej różnicy, osobiście ...
  • Kiedy jesteś zmuszony przez szkodliwe API, która zwraca lub bierze Hashtable (stosunkowo rzadkie, na szczęście)

nie pamiętam, kiedy ostatni raz był w takiej sytuacji osobiście - powiedziałbym, że to rzadki być znikomo odpowiednie do użycia Hashtable we współczesnym kodzie Java.

+0

Po prostu, aby dodać z java 1.6, otrzymasz HashTable jako przestarzałą kolekcję. – kosa

+1

@thinksteep: Naprawdę? Nie widzę żadnych uwag o wycofaniu w dokumentach 1.6: http://docs.oracle.com/javase/6/docs/api/java/util/Hashtable.html –

+0

@JonSkeet Wpisuję tylko ten fragment o pamięci tylko obejmują wszystkie podstawy - w praktyce różnica w pamięci jest dość mała, aby była znikoma. Zastanawiam się, czy były jakieś dziwne przypadki, w których 'Hashtable' byłaby bardziej przydatna niż' HashMap'. Dzięki za wyliczenie wszystkich różnych scenariuszy! –

7

Mogę wymyślić tylko jeden ważny powód - gdy używasz interfejsu API, który go wymaga, takiego jak JNDI's hugely irritating InitialContext class.

Co więcej, nie widzę żadnego powodu, aby w ogóle używać Hashtable. Możesz uzyskać zsynchronizowaną wersję HashMap, używając Collections.synchronizedMap.

13

Nigdy. Hashtable było oryginalną implementacją mapy w Javie 1. Została ona wyprzedzona przez implementacje Map. Jasne, Hashtable zostało doposażone, ale nie jest to zbyt użyteczne.

Ma główny problem z tym, że jest zsynchronizowany. Oznacza to, że będzie wolny w dowolnych okolicznościach, w których jest dzielony między wątkami. ConcurrentHashMap to lepszy wybór w tej sytuacji. Jeśli korzystasz z jednego wątku, niezsynchronizowany HashMap jest lepszym wyborem.

+0

Dzięki za jasną, nowoczesną odpowiedź! – Fattie

1

Wiedząc, kiedy użyć jednej klasy lub struktury nad innym jest zasadniczo zrozumienie różnic pomiędzy nimi, a przed podjęciem decyzji, który z nich najlepiej pasuje do problemu pod ręką opartą na tych różnic.

Rozumiem, że Hashtable obiekt nie może przyjąć wartości zerowe

Tak więc w sytuacji, gdy trzeba przechowywać wartości zerowe, o Hashtable nie byłoby właściwe.

Również w przypadku Hashtable wyliczanie nie jest bezpieczne. Więc jeśli chcesz mieć możliwość zmiany zawartości struktury podczas wyliczania, bardziej odpowiednie byłoby ustawienie Hashtable.

Powiązane problemy