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
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ớiWeakReference
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ímWeakReference
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
equals
vàhashcode
. 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ặcIdentityHashMap
.
Có thể lựa chọn khả thi duy nhất là thay đổi các lớp chính equals
và hashcode
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.
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.
Đó 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 '=='. –
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.
Pull Rquest to fix the ehcache3 ConcurrentWeakIdentityHashMap Key hashCode
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
- 1. ConcurrentHashMap khóa
- 2. Nhận chìa khóa băm và chuyển đổi thành chuỗi ruby
- 3. nhận ra "loại" của các khóa băm
- 4. Cần lời giải thích đơn giản như thế nào "khóa vằn" làm việc với ConcurrentHashMap
- 5. Hash-consing trong F # và bảng băm yếu trong .net
- 6. ConcurrentHashMap và Hashtable trong Java
- 7. Tìm tên khóa trong băm chỉ với một khóa?
- 8. Brute buộc DES với khóa yếu
- 9. Cặp làm khóa băm
- 10. Tạo nhận dạng SQL làm khóa chính?
- 11. Hàm băm tốt nhất cho số nhận dạng chữ và số hỗn hợp
- 12. Đối tượng làm khóa băm
- 13. Lisp thường gặp: nhận tất cả các khóa của một bảng băm đã cho dưới dạng danh sách
- 14. Xác nhận nội dung tệp đối với băm
- 15. Có bất kỳ hạn chế nào với ConcurrentHashMap không?
- 16. ConcurrentHashMap memory overhead
- 17. băm khóa facebook, sự nhầm lẫn của kho khóa android
- 18. Trao đổi các khóa và giá trị trong một băm
- 19. ConcurrentHashMap trong Java?
- 20. ConcurrentHashMap cho C++
- 21. Tạo một hàm băm Perl với một mảng làm khóa
- 22. MAS: Mã ký nhận dạng khóa cá nhân
- 23. Bản đồ với Khóa dưới dạng Chuỗi và Giá trị dưới dạng Danh sách trong Groovy
- 24. Hibernate, thay đổi số nhận dạng/khóa chính
- 25. ConcurrentHashMap vs HashMap đồng bộ
- 26. Nhận dạng mã vạch với AI
- 27. cách tạo băm trong băm
- 28. Xác nhận hàm băm muối
- 29. Tìm nhóm trong unordered_map từ băm mà không cần khóa
- 30. Mảng chuỗi là khóa hàm băm?
Bất kỳ ý kiến về các lựa chọn có thể? –
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. –
Về hiệu suất của bản đồ yêu cầu từ Ổi, nó sẽ giống như 'java.util.concurrent.ConcurrentHashMap'? –