如果只有迭代器存在,List 会被垃圾回收吗
Would List be garbage collected if only iterator exists
我有创建和returns我的方法用户列表:
private List<User> createUsers() {
List<User> users = new ArrayList<>();
//fill list
return users;
}
在我得到这个列表之后,我唯一要做的就是获取迭代器并遍历它。所以我正在考虑只返回迭代器而不是整个列表:
private Iterator<User> getUsersIterator() {
List<User> users = new ArrayList<>();
//fill list
return users.iterator();
}
但我不确定该列表是否仍然有效。现有的迭代器是否避免了垃圾收集?
是的,
迭代器需要对其后备集合的引用才能检索其元素,因此对它的引用将阻止其集合被垃圾回收。
例如,在 ArrayList
的情况下,它被实现为一个内部 class,它保持对其封闭 class 的引用。
Does the existence of an iterator avoid garbage collection of a collection?
是的。迭代器必须包含对集合的引用。 next()
和 hasNext()
方法 1 的任何正常实现都需要这样做。
所以如果迭代器是可达的,集合也是可达的。
这也可能对您不利。例如,对隐藏在静态变量中的迭代器的不需要的引用可能会导致涉及整个集合的内存泄漏。
1 - 假设迭代器实现可以使用软引用或弱引用,但结果可能是迭代 "breaks" 由于集合被垃圾收集。
我有创建和returns我的方法用户列表:
private List<User> createUsers() {
List<User> users = new ArrayList<>();
//fill list
return users;
}
在我得到这个列表之后,我唯一要做的就是获取迭代器并遍历它。所以我正在考虑只返回迭代器而不是整个列表:
private Iterator<User> getUsersIterator() {
List<User> users = new ArrayList<>();
//fill list
return users.iterator();
}
但我不确定该列表是否仍然有效。现有的迭代器是否避免了垃圾收集?
是的,
迭代器需要对其后备集合的引用才能检索其元素,因此对它的引用将阻止其集合被垃圾回收。
例如,在 ArrayList
的情况下,它被实现为一个内部 class,它保持对其封闭 class 的引用。
Does the existence of an iterator avoid garbage collection of a collection?
是的。迭代器必须包含对集合的引用。 next()
和 hasNext()
方法 1 的任何正常实现都需要这样做。
所以如果迭代器是可达的,集合也是可达的。
这也可能对您不利。例如,对隐藏在静态变量中的迭代器的不需要的引用可能会导致涉及整个集合的内存泄漏。
1 - 假设迭代器实现可以使用软引用或弱引用,但结果可能是迭代 "breaks" 由于集合被垃圾收集。