2011-11-22 8 views
15

Kiedy próbowałem używać hashtable klasę, Netbeans dał mi błąd mówiąc:Zastąpienie przestarzałych klasy Hashtable w Javie

Choć nadal obsługiwane, klasy te zostały wykonane przestarzałe klas zbiórki JDK1.2 i prawdopodobnie nie powinien być używany w nowych projektach.

Jednak nie wydaje się znaleźć w internecie na przykład lepszy zamiennik Hashtable. Jakieś sugestie?

+0

Generalnie powinieneś używać HashMap. – user949300

Odpowiedz

31

Najbardziej bezpośrednim zamiennikiem Hashtable jest HashMap.

Na różnicą, że mógłby być ważne jest to, że wszystkie odpowiednie metody Hashtable są zsynchronizowane, gdy są nie zsynchronizowane na HashMap.

+2

Jeśli potrzebujesz synchronizacji (dostarczonej przez HashTable), możesz użyć ['Collections.synchronizedMap()'] (http://docs.oracle.com/javase/7/docs/api/java/util/Collections.html #synchronizedMap (java.util.Map)) do dekoracji normalnego 'HashMap' lub użycia [' ConcurrentHashMap'] (http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ConcurrentHashMap .html), który umożliwia równoczesne czytanie i modyfikowanie bez konieczności blokowania. –

+0

Ale nie będziesz w stanie zastąpić Hashtable przez HashMap, jeśli masz trzecią bibliotekę warstwową wymagającą HashMap lub Dictionary (super typ HashMap), taką jak ta w org.osgi.framework.BundleContext.registerService (String string, Object o, Dictionary dctnr). – javadev

3

Można chyba użyć HashMap:

Map<String, Integer> mymap = new HashMap<String, Integer>(); 
6

Lepszy zamiennik Hashtable jest HashMap.

chodzi o bycie przestarzały, nie mam odniesienia do niej, ale stany javadoc:

Jako platformy Java 2 v1.2, klasa ta została doposażyć implementować interfejs Map, co czyni go członek Java Collections Framework.

Hashtable jest zsynchronizowany w przeciwieństwie do HashMap.

4

Powinieneś używać HashMap, ale nie jest on przeznaczony dla środowisk współbieżnych, w których możesz używać ConcurrentHashMap.

LUB

Map<K,V> myMap = Collections.synchronizedMap(/*any map instance*/); 
3

Istnieją przypadki, gdy metoda poza kontrolą wymaga Hashtable. Własny numer Javy javax.management.ObjectName to taki przykład: [1].

Gdy interfejs zewnętrzny tego wymaga, należy użyć Hashtable. w NetBeans, można użyć:

@SupresssWarnings("UseOfObsoleteCollectionType") 

tłumić ostrzeżenie lokalnie.

Zobacz

1: Zastanawiam się, dlaczego kiedyś Hashtable i nie HashMap, ponieważ ObjectName jest dostępny od 1,5 i Hashtable jest przestarzała od 1.2

0
  • Dla normalnych (tj. brak dostępu współbieżnego) - użyj HashMap (zwykle przez interfejs Map).
  • Jeśli potrzebujesz prostego synchronizacji otoki dla istniejącej mapie - użyj Collections.synchronizedMap (...)
  • Jeśli potrzebujesz klasę starannie i optymalnie zaprojektowane do jednoczesnego dostępu - stosowanie ConcurrentHashMap (zwykle poprzez interfejs ConcurrentMap który rozciąga interfejs mapy z dodatkowymi funkcjami współbieżności).