[英]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.