2011-11-22 26 views
15

Khi tôi cố gắng sử dụng lớp Hashtable, Netbeans đã cho tôi một lỗi nói:thay thế cho lớp Hashtable lỗi thời trong Java

Trong khi vẫn hỗ trợ, các lớp này đã được thực hiện đã lỗi thời bởi các lớp học tập JDK1.2, và có lẽ không nên được sử dụng trong phát triển mới.

Tuy nhiên, dường như tôi không thể tìm thấy ví dụ trực tuyến để thay thế tốt hơn cho Hashtable. Bất kỳ đề xuất?

+0

Nói chung, bạn nên sử dụng HashMap. – user949300

Trả lời

31

Thay thế trực tiếp nhất của HashtableHashMap.

On khác biệt mà thể quan trọng là tất cả các phương pháp có liên quan của Hashtable được đồng bộ hóa khi họ đang không đồng bộ trên HashMap.

+2

Nếu bạn cần đồng bộ hóa (do Hashtable cung cấp), bạn có thể sử dụng ['Collections.synchronizedMap()'] (http://docs.oracle.com/javase/7/docs/api/java/util/Collections.html #synchronizedMap (java.util.Map)) để trang trí một 'HashMap' bình thường hoặc sử dụng [' ConcurrentHashMap'] (http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ConcurrentHashMap .html) cho phép đọc đồng thời và sửa đổi mà không yêu cầu khóa. –

+0

Nhưng bạn sẽ không thể thay thế Hashtable bằng HashMap nếu bạn có thư viện lớp thứ ba cần một HashMap hoặc một Từ điển (siêu kiểu HashMap) giống như một trong org.osgi.framework.BundleContext.registerService (Chuỗi chuỗi, đối tượng o, từ điển dctnr) một. – javadev

3

Bạn có thể có thể sử dụng HashMap:

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

Một sự thay thế tốt hơn cho HashtableHashMap.

Đối với bị lỗi thời, tôi không có tham chiếu đến nó, nhưng các bang Javadoc:

Tính đến nền tảng v1.2 Java 2, lớp này được trang bị thêm cho thực hiện các giao diện Map, làm cho nó một thành viên của số Java Collections Framework.

Hashtable được đồng bộ hóa không giống như HashMap.

4

Bạn nên sử dụng HashMap, nhưng nó không được thiết kế cho môi trường đồng thời, nơi bạn có thể sử dụng ConcurrentHashMap.

HOẶC

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

Có những trường hợp khi một phương pháp ngoài tầm kiểm soát của bạn đòi hỏi một Hashtable. riêng của Java javax.management.ObjectName là ví dụ như vậy [1].

Khi giao diện bên ngoài yêu cầu bạn phải sử dụng Hashtable. Trong netbeans, bạn có thể sử dụng:

@SupresssWarnings("UseOfObsoleteCollectionType") 

để chặn cảnh báo cục bộ.

Xem

1: Tôi tự hỏi tại sao họ đã sử dụng Hashtable và không HashMap, vì ObjectName là sẵn từ 1.5 và Hashtable là lỗi thời kể từ 1.2

0
  • Đối với bình thường (tức là truy cập không đồng thời) - sử dụng HashMap (thường là thông qua giao diện Bản đồ).
  • Nếu bạn cần một trình bao bọc đồng bộ hóa đơn giản cho Bản đồ - sử dụng Collections.synchronizedMap (...)
  • Nếu bạn cần một lớp học được thiết kế cẩn thận và tối ưu để truy cập đồng thời - hãy sử dụng ConcurrentHashMap (thường là thông qua giao diện ConcurrentMap mở rộng giao diện Bản đồ với các tính năng tương tranh bổ sung).