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}