我只是想知道内部和外部迭代的真正好处是什么,以及为什么使用内部操作更好(至少是我所听到的)。 在内部迭代集合时,是否还可以删除集合的元素?像在代码示例中一样:
我知道内部迭代的代码可读性更好,但是还有其他诸如性能改进之类的好处吗?
//List with Strings of Fruit-Names
Iterator i = aList.iterator();
String str = "";
while (i.hasNext()) {
str = (String) i.next();
if (str.equals("Orange")) {
i.remove();
System.out.println("\nThe element Orange is removed");
break;
}
}
答案 0 :(得分:2)
您的条件有点简单,因为您可以简单地使用aList.remove("Orange")
。 aList.removeAll(Collections.singleton("Orange"))
代替了,但是有一个内部迭代的替代方法,它也可以用于更复杂的条件aList.removeIf(str -> str.equals("Orange"))
。
对于ArrayList
,这将立即显示出内部迭代的优势:如果在remove()
上调用Iterator
,则ArrayList
无法控制循环,因此不知道何时退出。放弃Iterator
。您可以随时通过List
界面访问列表,阅读并继续进行迭代或写入,而无需进一步迭代。
因此,每次调用remove()
时,列表都必须进入一致状态,即,删除元素时,所有后续元素都必须在正确的位置复制。这使ArrayList
的时间复杂度最差的情况从O(n²)
迭代中删除。
相反,removeIf
方法仅需要在返回时提供List
的完整状态。因此,它可以将复制元素推迟到最终位置已知的时候,这使其成为O(n)
操作。因此,对于大型列表,存在明显的性能优势。
通常,具有内部迭代的方法提供了针对特定内部数据结构进行优化实现的可能性,但绝不会比外部循环差,因为基于迭代器的循环仍然是这些方法的后备。
答案 1 :(得分:0)
所以我要在这里阻止您-您的术语没有任何意义。您可能想尝试使用的是内部循环的概念,它可以有效地在迭代内部进行迭代,就像模拟手表的表盘一样。 >
您的代码只有一个循环。这是while
循环,即 it 。这使您成为问题的一部分……有效地解决了。您可以根据需要反复遍历一个或多个(集合...)集合。
否则,这是在迭代时从集合中删除元素的正确方法。任何其他方法都会使您a ConcurrentModificationException
。如果您想称其为性能优势,那么当您希望以这种方式删除元素时,就不会抛出异常。