![](/img/trans.png)
[英]How to know whether Iterator of a Collection supports remove()?
[英]Merge the iterator collection after remove method is called. How the change is reflected in main collection?
我瀏覽了很多網頁,了解ConcurrentHashMap
的工作原理以及它如何克隆實際的迭代地圖。 這樣可以獲得弱一致的屬性。
現在,在迭代時,如果我調用remove()
方法,那么這個更改在哪個階段反映在主集合中?
基本上,想要了解克隆和主要集合是如何合並的?
一旦迭代完成,它就完成了嗎?
首先, ConcurrentHashMap
不會使副本迭代,請參閱ConcurrentHashMap#entrySet
。
其次, remove
的更改立即反映到集合中,請參閱ConcurrentHashMap#BaseIterator#remove
。
這個想法是ConcurrentHashMap
使用桶,就像任何其他基於哈希的結構一樣。 當您查找( remove
)一個條目時,它使用hashCode查找該條目可能首先駐留的存儲桶 ,然后立即將其刪除。
問題是,你能否發現/看到實際發生的這種刪除; 例如,您迭代並打印CHM
的內容並同時刪除一些條目。 如果您已經通過forEach
“訪問”某個存儲桶(並且以桶到桶的方式進行遍歷),並且該條目已從該存儲桶中刪除 - 您將無法發現它。
另一方面,如果您將從“尚未訪問”的存儲桶中刪除並輸入 - 您將發現刪除。
這就是size
返回“此刻”已知大小的原因 - 例如來自bucketA的條目,然后有人刪除其中的一些條目, CHM
將不會返回或同步再次計算這些條目。
還有一些非常好的評論在這里閱讀
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.