2012-03-19 68 views
19

Sự khác nhau giữa DictionaryHashtable là gì và làm cách nào để làm việc với lớp học Dictionary trong Java?Sự khác biệt giữa Hashtable và Từ điển là gì?

+0

Có rất nhiều nội dung hay trong google - http://docs.oracle.com/javase/tutorial/collections/implementations/index.html – Vic

+0

Và trên stackoverflow - http://stackoverflow.com/questions/267312/different-between-a-hashmap-và-a-dictionary-adt – Vic

+2

Nếu bạn có lựa chọn, bạn nên sử dụng 'Bản đồ' thay vì' Từ điển', đã lỗi thời. – assylias

Trả lời

18

Dictionary là lớp cơ sở trừu tượng là Hashtable. Cả hai vẫn còn trong JDK cho khả năng tương thích ngược với mã cũ. Chúng tôi dự kiến ​​sử dụng HashMap và các triển khai khác của giao diện Map được giới thiệu trong Java 1.2.

+1

Đáng nói đến là Hashtable là luồng an toàn, trong khi HashMap thì không. Xem câu trả lời của tôi. – assylias

+0

Hashtable đã được trang bị thêm để triển khai Bản đồ. – user2864740

2

Tôi đã tìm thấy một bài giảng về Nguyên tắc OOP có chứa câu trả lời mà bạn tìm kiếm:

http://www.clear.rice.edu/comp202/04-fall/lectures/lec23/

EDIT:

điển Một chủ đề quan trọng trong tính toán là chủ đề của lưu trữ/truy xuất/xóa: lưu trữ dữ liệu ở đâu đó để sau này có thể được truy xuất và d iscarded nếu không còn cần thiết, tất cả điều này một cách hiệu quả nhất. Sự trừu tượng của các hoạt động tính toán này được thể hiện trong khái niệm về cái được gọi là từ điển, được biểu diễn bằng Java như một giao diện như sau.

Bàn Hash Một bảng băm là một sự tổng quát của một mảng bình thường. Khi số lượng khóa thực sự được lưu trữ nhỏ so với tổng số khóa có thể, bảng băm trở thành một thay thế hiệu quả để trực tiếp giải quyết mảng, vì bảng băm thường sử dụng một mảng có tỷ lệ thuận với số khóa thực sự được lưu trữ. Thay vì sử dụng khóa làm chỉ mục mảng trực tiếp, chỉ mục mảng được tính từ khóa. Với băm, phần tử có khóa k được lưu trữ trong khe h (k); tức là hàm băm h được sử dụng để tính toán khe từ khóa k. h maps tập U chìa khóa vào khe của một bảng băm T [0..m-1]: h: U -> {0, 1, ..., m - 1}

2

Lớp Từ điển là lớp cha trừu tượng của bất kỳ lớp nào, chẳng hạn như Hashtable, mà ánh xạ các khóa tới các giá trị. Mỗi khóa và mọi giá trị đều là một đối tượng. Trong bất kỳ đối tượng Từ điển nào, mỗi khóa được kết hợp với nhiều nhất một giá trị. Với một từ điển và một khóa, phần tử liên quan có thể được tra cứu. Bất kỳ đối tượng không null nào cũng có thể được sử dụng làm khóa và làm giá trị.

14

javadoc cho Dictionary có câu trả lời của bạn.

Lớp từ điển là cha mẹ trừu tượng của bất kỳ lớp nào, chẳng hạn như Hashtable, ánh xạ khóa cho giá trị.

Bạn không làm việc trực tiếp với Dictionary, vì đây là lớp học abstract.

Cũng lưu ý sau đây từ các tài liệu tương tự:

LƯU Ý: Lớp này là lỗi thời. Triển khai mới sẽ triển khai giao diện Map, thay vì mở rộng lớp này.

3

Hashtable là triển khai Dictionary. Bạn không thể sử dụng trực tiếp Dictionary vì đó là lớp trừu tượng.

Nhưng bạn không nên sử dụng vì chúng đã được superceded bởi giao diện Map và các lớp triển khai, trong đó HashMap là phổ biến nhất.

1

Theo javadocs cho từ điển:

LƯU Ý: Lớp này là lỗi thời. Triển khai mới nên triển khai giao diện Bản đồ , thay vì mở rộng lớp này.

Hashtable cũng là JDK 1.0 vintage. Bạn nên sử dụng giao diện Bản đồ và các triển khai hiện đại hơn của nó: HashMap và TreeMap.

8

Dictionary là lớp trừu tượng, siêu lớp của Hashtable. Bạn không nên sử dụng Dictionary vì nó là obsolete. Đối với Hashtable, lợi thế nó đã có hơn bản đồ khác như HashMap là chủ đề an toàn, nhưng với sự ra đời của ConcurrentHashMap kể từ Java 1.5, không có lý do thực sự để sử dụng nó nữa - xem javadoc

Tính nền tảng Java 2 v1.2, lớp này được trang bị thêm để triển khai thực hiện giao diện Bản đồ, làm cho nó trở thành một thành viên của Khung công tác Bộ sưu tập Java. Không giống như các triển khai bộ sưu tập mới, Hashtable được đồng bộ hóa. Nếu không cần thực thi an toàn chỉ, bạn nên sử dụng HashMap thay cho Hashtable. Nếu bạn muốn triển khai đồng thời nhiều luồng an toàn, thì nên sử dụng ConcurrentHashMap thay cho Hashtable.

Nói tóm lại: Không sử dụng Dictionary hoặc Hashtable, trừ khi bạn thực sự phải vì những lý do tương thích, sử dụng một trong hai HashMap nếu bạn không cần phải an toàn thread, hoặc ConcurrentHashMap nếu bản đồ của bạn được sử dụng trong một đồng thời môi trường.

Các vấn đề liên quan