【发布时间】:2010-02-01 05:04:17
【问题描述】:
在集合上打开的迭代器实例是否将整个集合保存在内存中并访问每次调用 next() 时递增的位置?还是我错过了什么?
【问题讨论】:
-
您可以随时查看源代码并找出答案:)
-
源代码参考JDK类ArrayList:docjar.com/html/api/java/util/ArrayList.java.html的代码,其中Iterator被实现为内部类
在集合上打开的迭代器实例是否将整个集合保存在内存中并访问每次调用 next() 时递增的位置?还是我错过了什么?
【问题讨论】:
Iterator 的实现取决于它正在迭代的特定Collection。如果您查看 JDK 源代码,例如 ArrayList 和 LinkedList 使用不同的迭代器。
记住Iterator 是一个接口而不是一个具体的类,所以它只是指定一个契约而不是一个实现。
一般来说,迭代器将(取决于实现)存储对集合的引用和某种索引来标记它们的位置。
【讨论】:
完全取决于实现,但一般来说(对于为内存中集合构建的迭代器),迭代器将具有对底层集合的引用,所以是的,它将保留在内存中。
请注意,此引用很可能不是副本,这就是迭代器检查对其创建所在的集合的并发修改的原因。
【讨论】:
这完全取决于与Iterator 相关的对象。请记住,(几乎)每个Iterator 都与我们迭代的Iterable 相关。
每个Iterable 类都可以定义自己的Iterator 类,该类可根据请求返回next() 元素。
它是如何做到这一点的,这决定了哪些数据是即时可用的:
在情况 1 中,将所有内容保存在内存中可能没有用,但在情况 2 中,我们已经在内存中拥有所有内容,我们可以(并且将)确实查询该对象下一个位置的项目。
【讨论】: