1

我有一個ConcurrentSkipListMap。我需要刪除低於key的元素。如何刪除元素以鍵入ConcurrentSkipListMap?

這是我如何可以執行它:

private ConcurrentNavigableMap<Double, MyObject> myObjectsMap = new ConcurrentSkipListMap<>(); 

//... 

myObjectsMap = myObjectsMap.tailMap(10.25, false); 

看起來不錯,但我感到困惑的這些事實:

1.

返回的映射受此映射支持,因此返回的地圖 中的更改會反映在此地圖中,反之亦然。

這是否意味着舊值不會被垃圾回收器清除?
I.e.我們刪除了舊地圖,現在我們有了一張新地圖。但是這張新地圖由舊地圖支持。那麼,舊地圖會發生什麼?它會被刪除還是永遠坐在記憶中?

2.

返回的映射將拋出嘗試 插入其範圍之外的關鍵一個IllegalArgumentException。

所以,現在我不能把新的關鍵小於10.25和超過最大值?

我很困惑。那麼如何正確地從ConcurrentSkipListMap中刪除元素呢?

+0

將頭部內容複製到新地圖中不是最安全的:'myObjectsMap = new ConcurrentNavigableMap <>(myObjectsMap.headMap(10.25,false));' –

回答

2

這是否意味着舊值不會被垃圾回收器清除? 也就是說我們刪除了舊地圖,現在我們有了一張新地圖。但是這張新地圖由舊地圖支持。那麼,舊地圖會發生什麼?它會被刪除還是永遠坐在記憶中?

是的,事實上。舊地圖仍然存在,它會留在周圍。

如果你想刪除 10.25 <,然後做

map.headMap(10.25, false).clear(); 

...這將創建一個子映射,刪除其所有元素 - 從原來的地圖中刪除,太 - - 然後丟棄該子圖視圖,讓它收集垃圾並留下原始地圖對象,只包含大於等於10.25的關鍵字。

請注意,雖然這可以保證在操作開始時移除< 10.25的密鑰,但不保證新密鑰未被同時插入,或者可能會在稍後插入新密鑰。真的,你無能爲力。如果你想確定你只是在大於等於10.25的值上運行,那麼繼續使用map.tailMap(10.25, true),但其他小於10.25的值可能仍然被插入,並且它們仍然在內存中。

+0

這只是一個完美的答案。非常感謝您澄清! – Alexandr