2013-10-14 20 views
9

Có phải HashSet<WeakReference<T>> số Set tương đương WeakHashMap<T> không? Nghĩa là, các mục nhập sẽ bị xóa tự động khi chúng không còn được tham chiếu?Đặt tương đương với WeakHashMap?

Nếu không, tương đương là gì?

+0

Tin rằng đây là những gì bạn có thể đang tìm kiếm: http://stackoverflow.com/a/4062950/717932 – dardo

+0

bản sao có thể có của [Tại sao tồn tại WeakHashMap, nhưng WeakSet vắng mặt?] (Http://stackoverflow.com/ question/4062919/why-does-exist-weakhashmap-nhưng-absent-weakset) –

+1

Câu hỏi này không trùng lặp. Câu hỏi khác cố gắng trả lời tại sao không có WeakSet. Nó không cung cấp một tập tương đương, cũng không trả lời xem ví dụ của tôi ở trên có được tính là tương đương hay không. –

Trả lời

13

Không, nếu một đối tượng tham chiếu bởi một trong những WeakReference s trong tập được thu gom rác, các WeakReference sẽ vẫn được đưa vào các thiết lập và sẽ không được gỡ bỏ tự động, nhưng referent của họ sẽ được null. A WeakHashMap sử dụng mã bổ sung để xóa các khóa được tham chiếu yếu khỏi bản đồ khi chúng được thu thập rác.

Một bộ tương đương với một WeakHashMap là:

Set<T> set = Collections.newSetFromMap(new WeakHashMap<T, Boolean>()); 

Là một HashSet cũng sử dụng một HashMap nội bộ.

BTW: WeakReference chỉ là một đối tượng trỏ đến đối tượng có thể được thu thập rác mặc dù tham chiếu được giữ bởi WeakReference. Bản thân WeakReference sẽ không bị thu gom rác cho đến khi nó không được tham chiếu mạnh ở bất cứ nơi nào nữa giống như tất cả các đối tượng khác.

+0

Đó là câu trả lời tôi đang tìm kiếm. Cảm ơn bạn! –