迭代器可以阻止其LinkedList被垃圾回收吗?

时间:2017-01-10 14:56:15

标签: java garbage-collection iterator

在Java中,在方法中创建LinkedList并返回其迭代器是安全的:

public Iterator<Integer> iterator()
{
   LinkedList<Integer> list = new LinkedList<>();
   list.add(1);
   return list.iterator();
}

在方法返回后,列表是否有可能被垃圾收集?

5 个答案:

答案 0 :(得分:2)

代码是安全的,从某种意义上讲,只要Iterator可以从任何活动线程访问它就无法完成,它将继续工作。

理论上,如果底层List是不可修改的,那么它的<p>{!! $recent->blog_content !!}</p> 实现可以创建自己的列表数据副本,而不是保留任何指向List的指针。在这种情况下,列表可能是垃圾收集。迭代器将继续工作。

在实践中,我所见过的所有iterator()实现都明确地或通过作为内部类来保持对Collection的引用。只要可以访问迭代器,集合仍然可以访问。

答案 1 :(得分:1)

只要迭代器在周围,列表就不会被垃圾收集。

答案 2 :(得分:1)

在所有方面我都可以想到初始化迭代器,它会引用LinkedList,因此不会被垃圾回收。

答案 3 :(得分:1)

只要有一个指向列表的指针,它就不会受到垃圾收集的影响。

因此,如果您只是调用该方法,则没有指针:

iterator();

这里有一个指针,只要它持续存在,你就不必担心垃圾收集了:

 Iterator<Integer> o = iterator();

答案 4 :(得分:0)

我假设您确实想要返回Iterable<Integer>。这是一个列出工具的接口,Iterable基本上允许迭代列表。

public Iterable<Integer> iterator()
{
    LinkedList<Integer> list = new LinkedList<>();
    list.add(1);
    return list;
}

这当然可以向下转换,但是Iterable接口会向用户暗示这是一个坏主意。它还需要用户方面的一些工作才能知道这是一个LinkedList而不是其他一些实现相同接口的类。