gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 07:44:01 25 4
gpt4 key购买 nike

我写了一些有效的代码,但我不确定。考虑一下

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(不仅仅是将 6 添加到映射中 TreeSet 的副本),表明 get 是按引用传递的。有人可以帮助消除这里的困惑吗?

最佳答案

HashMap 中删除 TreeSet 不会破坏 TreeSet;它只是删除了 HashMap 中对 TreeSet 的引用。 HashMap 不包含 TreeSet 的副本,仅包含对 TreeSet 的引用。

首先:

{map} -----> {aTreeSet}
|
v
{6}

迭代器的目的是迭代某些东西。在这种情况下,它迭代 TreeSet 元素的逻辑方法是维护自己对 TreeSet 的引用(或 TreeSet 中的内部数据结构) )。这些元素始终至少由一个强引用引用,因此它们永远不会被垃圾回收。

创建迭代器时:

{map} -----> {aTreeSet} <----- {Iterator}
|
v
{6}

从 map 中删除后(并添加到 LinkedList 中):

{map}        {aTreeSet} <----- {Iterator} <----- {iterators}
|
v
{6}

总而言之,TreeSet 元素永远不符合垃圾回收条件;只有一个 TreeSet 对象,并且它的元素仍然可用于迭代。

关于java - 已删除列表上的有效迭代器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34185876/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com