2013-03-17 24 views
17

Làm cách nào để nhận được ConcurrentHashMap với các khóa yếu và băm nhận dạng trong Java? Tôi nghĩ Bộ sưu tập của Google Guava có thể cung cấp một thứ như vậy, nhưng tôi có thể lấy nó từ thư viện chuẩn không? Tôi có những lựa chọn nào khác?ConcurrentHashMap với khóa yếu và băm nhận dạng?

Trả lời

9

Tôi nghĩ Bộ sưu tập Google ổi có thể cung cấp cho một điều như vậy, nhưng tôi có thể lấy nó từ thư viện chuẩn không?

Câu trả lời ngắn gọn cho điều đó là Không. Java SE không triển khai kết hợp cụ thể này.

  • Bạn có thể nhanh chóng một java.util.concurrent.ConcurrentHashMap với WeakReference phím, và làm một số công việc phụ để thực hiện loại bỏ các mục bản đồ để tham khảo bị hỏng, nhưng điều đó sẽ không cung cấp cho bạn ngữ nghĩa bản sắc băm.

  • Bạn có thể tạo nhanh java.util.IdentityHashMap bằng các phím WeakReference và thực hiện thêm một số công việc để triển khai xóa mục nhập cho các tham chiếu bị hỏng, nhưng điều đó sẽ không cho bạn hành vi đồng thời.

  • Sử dụng java.util.WeakHashMap sẽ không cung cấp cho bạn đồng thời hoặc băm nhận dạng.

  • Bạn có thể (theo lý thuyết) bao bọc lớp chính trong thứ gì đó vượt quá các phương pháp tự nhiên equalshashcode. Nhưng đó là rất có thể là không sử dụng được.

  • Tôi không nghĩ rằng điều này có thể thực hiện được bằng cách ghi đè các phương thức trong ConcurrentHashMap hoặc IdentityHashMap.


Có thể lựa chọn khả thi duy nhất là thay đổi các lớp chính equalshashcode phương pháp để có bản sắc dựa. Nhưng điều đó sẽ không hoạt động đối với các loại khóa "tích hợp" (đặc biệt là các loại khóa final) hoặc trong trường hợp bạn cần bằng/giá trị băm dựa trên giá trị trong các phần khác của ứng dụng.

+0

Bất kỳ ý kiến ​​về các lựa chọn có thể? –

+1

Sử dụng Google ổi. Đó là một lựa chọn. (Bất kỳ lý do nào không sử dụng nó?) Hoặc viết thực hiện của riêng bạn từ đầu. –

+0

Về hiệu suất của bản đồ yêu cầu từ Ổi, nó sẽ giống như 'java.util.concurrent.ConcurrentHashMap'? –

1

Triển khai Google ổi xuất hiện là cách dễ nhất để thực hiện. Người ta có thể khởi tạo bản đồ yêu cầu với new MapMaker().weakKeys().makeMap() và sử dụng như một bản đồ sẽ sử dụng java.util.concurrent.ConcurrentHashMap. Xem apidoc để biết thêm chi tiết.

+0

Đó là chính xác - tại sao nó được giảm giá? Bạn nên suy nghĩ rằng bằng cách sử dụng các phím yếu gây ra sự bình đẳng chính để được đánh giá với '=='. –

0

tìm kiếm ConcurrentWeakIdentityHashMap, bạn sẽ nhận được nhiều ví dụ. Tôi đã viết một thực hiện bản thân mình, vì tôi nghĩ rằng hashCode của org/ehcache/core/nội bộ/util/ConcurrentWeakIdentityHashMap $ WeakReference là rất xấu.

Example of ehcache3

Example I wrote

Pull Rquest to fix the ehcache3 ConcurrentWeakIdentityHashMap Key hashCode

+0

Cảm ơn bạn đã liên kết thứ hai. Nó giải quyết rất nhiều sự ủng hộ của tôi. Làm việc như một sự quyến rũ trong dự án AI của tôi. Đã phải thay đổi phạm vi lớp và các hàm tạo thành công khai mặc dù – Tschallacka

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