![](/img/trans.png)
[英]Iterating through a list and allowing it to have an item removed at the same time (NOT ITERATOR)
[英]Valid iterator on a removed list?
我寫了一些有效的代碼,但不確定。 考慮
LinkedList<Iterator<Integer>> iterators;
HashMap<Character, TreeSet<Integer>> map;
for (char c : map.keySet()) {
iterators.add(map.get(c).iterator());
map.remove(c);
}
即使原始TreeSet已被刪除,迭代器似乎也可以正常工作(即按照TreeSet的原始順序進行)。 我不太明白為什么它起作用了-好像這里是按值傳遞而不是按引用傳遞。 但是,很明顯,如果我要寫
map.get(c).add(6);
TreeSet實際上會在地圖中添加6(而不僅僅是在地圖中TreeSet的副本中添加6),表明get正在通過引用傳遞。 有人可以幫忙消除這里的困惑嗎?
從HashMap
刪除TreeSet
不會破壞TreeSet
; 它只是刪除HashMap
中對TreeSet
的引用。 該HashMap
不包含副本TreeSet
,只是給一個參考TreeSet
。
首先:
{map} -----> {aTreeSet}
|
v
{6}
Iterator
的目的是迭代某些東西。 在這種情況下,它遍歷邏輯方式TreeSet
元素是保持其自己的參考TreeSet
(或內的內部數據結構TreeSet
)。 這些元素總是至少被一個強引用引用,因此它們永遠不會被垃圾收集。
創建Iterator
:
{map} -----> {aTreeSet} <----- {Iterator}
|
v
{6}
從地圖中刪除(以及添加到LinkedList
):
{map} {aTreeSet} <----- {Iterator} <----- {iterators}
|
v
{6}
總而言之, TreeSet
元素永遠不適合進行垃圾回收; 只有一個TreeSet
對象,並且該對象的元素仍可用於迭代。
我閱讀了您的帖子5次,但仍無法理解混亂之處在哪里?
您是在問為什么從Map
刪除條目后, iterators
iterator
中仍然有有效的iterator
iterators
? 這就是Java中引用的工作方式...
線:
iterators.add(map.get(c).iterator());
在c
下創建對TreeSet
新強引用,因此不會set
該set
。
當涉及傳遞引用與傳遞值時,沒有什么比C / C ++中已知的真正傳遞引用更重要 。 有關詳細信息,請單擊此處 。
當談到線:
map.get(c).add(6);
我不知道你是什么意思
TreeSet實際上會在地圖中添加6(而不僅僅是在地圖中的TreeSet的副本中添加6)
您在地圖中復制TreeSet是什么意思? 復制什么? 它指向與iterator
iterators
指向的iterator
iterators
相同的TreeSet
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.