2012-03-02 6 views
20

Đây không phải là câu hỏi về sự khác biệt giữa HashtableHashMap. Tôi hiểu rằng đối tượng Hashtable không thể chấp nhận các giá trị null cho các mục nhập khóa hoặc giá trị, đó là bộ sưu tập được đồng bộ hóa và sử dụng ít bộ nhớ hơn HashMap.Khi nào tôi nên sử dụng Hashtable so với HashMap

Tôi đang tự hỏi về các tình huống ở đó thích hợp hơn khi sử dụng Hashtable thay vì HashMap.

+2

trùng lặp của http://stackoverflow.com/questions/40471/differences-between-hashmap-and-hashtable –

+0

@MattWolfe Nó không phải là một bản sao của câu hỏi đó. Câu hỏi đó đi qua những khác biệt. Tôi biết sự khác biệt. Tôi hỏi về thời điểm thích hợp để sử dụng cái kia. –

Trả lời

23

Đây không phải là một câu hỏi về sự khác nhau giữa HashtableHashMap

Vâng nó thực sự là ...

Tôi đang tự hỏi về các tình huống nơi mà nó sẽ thích hợp hơn sử dụng Hashtable thay vì HashMap.

chính xác khi bạn muốn sự khác biệt giữa hai:

  • Khi bạn muốn chạy trên Java 1.1
  • Khi bạn muốn mỗi hoạt động được đồng bộ hóa (nhận bạn một hình thức về an toàn luồng, miễn là bạn không bao giờ lặp lại nó) - và vì một lý do nào đó không muốn sử dụng Collections.synchronizedMap trên một HashMap
  • Khi bạn không muốn để có thể lưu trữ các giá trị null
  • Khi sự khác biệt nhớ là thực sự đáng kể (chỉ sau khi bạn đã chứng minh đây là trường hợp) - Tôi đã không hề biết sự khác biệt này, cá nhân ...
  • Khi bạn bị buộc phải bởi một API khó chịu trả về hoặc mất Hashtable (tương đối hiếm hoi, may mắn thay)

Tôi không thể nhớ lần cuối cùng tôi ở trong tình huống đó, cá nhân - tôi sẽ nói nó rất hiếm khi là thích hợp để sử dụng Hashtable trong mã Java hiện đại.

+0

Chỉ cần thêm từ java 1.6 trở đi, bạn sẽ nhận được HashTable như bộ sưu tập lỗi thời. – kosa

+1

@thinksteep: Thật sao? Tôi không thấy bất kỳ thông báo phản đối nào về 1.6 tài liệu: http://docs.oracle.com/javase/6/docs/api/java/util/Hashtable.html –

+0

@JonSkeet Tôi chỉ đặt bit đó về bộ nhớ cho bao gồm tất cả các căn cứ - trong thực tế sự khác biệt bộ nhớ là khá nhỏ như là không đáng kể. Tôi đã tự hỏi nếu có bất kỳ trường hợp góc kỳ lạ mà một 'Hashtable' sẽ hữu ích hơn một' HashMap'. Cảm ơn bạn đã liệt kê tất cả các kịch bản khác nhau! –

7

Tôi chỉ có thể nghĩ đến một lý do hợp lệ - khi bạn đang sử dụng API yêu cầu nó, chẳng hạn như JNDI's hugely irritating InitialContext class.

Ngoài ra, tôi có thể thấy không có lý do chính đáng để sử dụng Hashtable. Bạn có thể nhận phiên bản được đồng bộ hóa của HashMap bằng cách sử dụng Collections.synchronizedMap.

13

Không bao giờ. Hashtable là bản thực thi gốc của bản đồ trong Java 1. Nó bị vượt qua bởi việc triển khai Bản đồ. Chắc chắn, Hashtable đã được trang bị thêm cho phù hợp nhưng đó không phải là hữu ích khủng khiếp.

Có vấn đề chính ở chỗ nó được đồng bộ hóa. Điều này có nghĩa là nó sẽ bị chậm trong bất kỳ trường hợp nào mà nó được chia sẻ giữa các luồng. ConcurrentHashMap là một lựa chọn tốt hơn trong tình huống đó. Nếu bạn đang chạy trên một chủ đề duy nhất thì HashMap không đồng bộ là một lựa chọn tốt hơn.

+0

Cảm ơn câu trả lời rõ ràng, hiện đại !! – Fattie

1

Biết khi nào nên sử dụng một lớp hay cấu trúc khác hơn là về cơ bản tìm hiểu sự khác biệt giữa hai, và quyết định cái nào phù hợp nhất với các vấn đề trong tầm tay dựa trên những khác biệt.

Tôi hiểu rằng một đối tượng Hashtable không thể chấp nhận giá trị null

Vì vậy, trong tình huống mà bạn cần lưu trữ các giá trị null, một Hashtable sẽ không thích hợp.

Ngoài ra, trong một Hashtable, việc liệt kê không an toàn. Vì vậy, nếu bạn cần để có thể thay đổi nội dung của cấu trúc trong khi liệt kê, một Hashtable sẽ phù hợp hơn.