避免在 Java 中创建 Iterator 实例
Avoiding creating Iterator instances in Java
我需要在 ArrayList 上使用迭代器,但每次迭代它时,它都会创建一个迭代器实例(垃圾)。我需要一种方法来遍历列表而不产生垃圾。
示例:
for (Person person : people) {
person.sayHi();
}
实际上只有两种遍历列表的方法:
- 使用索引[为清楚起见进行编辑 -- 即使用传统的 for 循环]
- 使用迭代器
Enhanced for loops 只是语法糖,可以避免编写代码来制作 Iterator
.
您可以通过编写自己的重用 Iterator 的集合来做到这一点。出于某种原因,Java 库不提供替代方案或重复使用的迭代器(可能是因为他们不知道人们会用它们做什么)。
你从ArrayList
转换成一个数组,然后你可以通过索引迭代数组。
简单的答案是使用Java 8.这可以使用逃逸分析将Iterator
放在堆栈上,从而避免任何垃圾。
如果您卡在 Java 7 或更早的版本上,您可以这样做
for (int i = 0; i < list.size(); i++) {
Person p = mlist.get(i);
这里 post 解释了为什么 Iterator 似乎是在分析器中创建的,但当您不 运行 分析器时却不是。
http://psy-lob-saw.blogspot.co.uk/2014/12/the-escape-of-arraylistiterator.html
我需要在 ArrayList 上使用迭代器,但每次迭代它时,它都会创建一个迭代器实例(垃圾)。我需要一种方法来遍历列表而不产生垃圾。
示例:
for (Person person : people) {
person.sayHi();
}
实际上只有两种遍历列表的方法:
- 使用索引[为清楚起见进行编辑 -- 即使用传统的 for 循环]
- 使用迭代器
Enhanced for loops 只是语法糖,可以避免编写代码来制作 Iterator
.
您可以通过编写自己的重用 Iterator 的集合来做到这一点。出于某种原因,Java 库不提供替代方案或重复使用的迭代器(可能是因为他们不知道人们会用它们做什么)。
你从ArrayList
转换成一个数组,然后你可以通过索引迭代数组。
简单的答案是使用Java 8.这可以使用逃逸分析将Iterator
放在堆栈上,从而避免任何垃圾。
如果您卡在 Java 7 或更早的版本上,您可以这样做
for (int i = 0; i < list.size(); i++) {
Person p = mlist.get(i);
这里 post 解释了为什么 Iterator 似乎是在分析器中创建的,但当您不 运行 分析器时却不是。
http://psy-lob-saw.blogspot.co.uk/2014/12/the-escape-of-arraylistiterator.html