繁体   English   中英

删除列表上的有效迭代器?

[英]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新强引用,因此不会setset

当涉及传递引用与传递值时,没有什么比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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM