Java 移除列表上的有效迭代器?
我写了一些代码,但我不确定。考虑Java 移除列表上的有效迭代器?,java,iterator,pass-by-value,Java,Iterator,Pass By Value,我写了一些代码,但我不确定。考虑 LinkedList<Iterator<Integer>> iterators; HashMap<Character, TreeSet<Integer>> map; for (char c : map.keySet()) { iterators.add(map.get(c).iterator()); map.remove(c); } 树集实际上会在映射中添加6(而不仅仅是在映射中的树集副本中添加6
LinkedList<Iterator<Integer>> iterators;
HashMap<Character, TreeSet<Integer>> map;
for (char c : map.keySet()) {
iterators.add(map.get(c).iterator());
map.remove(c);
}
树集实际上会在映射中添加6(而不仅仅是在映射中的树集副本中添加6),这表明get是通过引用传递的。有人能帮我澄清一下这里的困惑吗?我读了你的帖子5遍,但我还是不知道哪里有困惑 您会问,为什么从
Map
中删除条目后,iterator
中仍有可用的iterator
?这就是Java中引用的工作方式
行:
创建对c
下的TreeSet
的新强引用,因此此集将不会被gced
当谈到按引用传递与按值传递时,C/C++中没有什么比真正的按引用传递更好的了。详情请参阅
说到线:
map.get(c).add(6);
我不知道你说的是什么意思
树集实际上会在地图中添加6(而不仅仅是在地图中的树集副本中添加6)
你们所说的地图上树丛的复制是什么意思?什么的副本?它指向与迭代器中的迭代器所指向的树集
相同的树集。从哈希映射中删除树集
不会破坏树集
;它只是删除HashMap
中对树集的引用。HashMap
不包含TreeSet
的副本,只是对TreeSet
的引用
首先:
{map} -----> {aTreeSet}
|
v
{6}
迭代器
的目的是对某个对象进行迭代。在这种情况下,它迭代树集
元素的逻辑方式是维护自己对树集
(或树集
内的内部数据结构)的引用。元素总是被至少一个强引用引用,因此它们永远不会被垃圾收集
创建迭代器时:
{map} -----> {aTreeSet} <----- {Iterator}
|
v
{6}
总之,TreeSet
元素永远不符合垃圾收集的条件;只有一个TreeSet
对象,它的元素仍然可用于迭代。来自TreeSet
的迭代器与哈希映射有什么关系?
{map} -----> {aTreeSet}
|
v
{6}
{map} -----> {aTreeSet} <----- {Iterator}
|
v
{6}
{map} {aTreeSet} <----- {Iterator} <----- {iterators}
|
v
{6}