内部迭代的好处
Benefits of internal iterations
我只是想知道,内部迭代与外部迭代的真正好处是什么,以及为什么使用内部操作更好(至少我是这么听说的)。
是否也可以在内部迭代集合时删除集合的元素?就像在代码示例中一样:
我知道内部迭代的代码可读性更好,但是还有其他一些好处比如性能提升吗?
//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;
}
}
所以我要在这里打断你 - 你的术语没有任何意义。您可能试图了解的是内循环的概念,即有效地在迭代内部迭代,很像模拟手表。
你的代码只有一个循环。这是while
循环,也就是它。这使您的问题的那一部分……实际上没有实际意义。您可以根据需要或需要多次迭代一个集合或集合的集合(集合的集合...)。
否则,这是在迭代集合时从集合中删除元素的正确方法;任何其他方法都会让你 a ConcurrentModificationException
。如果您想将其称为性能优势,那么当您想以这种方式删除元素时,您将受益于不会抛出异常。
你的条件有点简单,因为你可以简单地使用 aList.remove("Orange")
resp。 aList.removeAll(Collections.singleton("Orange"))
相反,但是有一个内部迭代的替代方案,它也适用于更复杂的条件,aList.removeIf(str -> str.equals("Orange"))
。
在 ArrayList
的情况下,这将立即显示内部迭代的优势:在 Iterator
上调用 remove()
的情况下,ArrayList
无法控制在循环中,因此不知道你什么时候退出它。放弃了Iterator
。您可以随时通过 List
接口访问列表,读取并继续迭代或写入而不进一步迭代。
因此每次调用 remove()
时,列表都必须处于一致状态,即在删除元素时必须将所有后续元素复制到正确的位置。这给出了迭代并从 ArrayList
中移除最坏的 O(n²)
时间复杂度的情况。
相比之下,removeIf
方法只需要在returns方法时提供List
的完成状态。因此,它可能会将复制元素推迟到最终位置已知时,这使其成为 O(n)
操作。因此,对于大型列表,具有显着的性能优势。
通常,具有内部迭代的方法提供了针对特定内部数据结构优化实现的可能性,同时永远不会比外部循环差,因为基于迭代器的循环无论如何都是这些方法的后备。
我只是想知道,内部迭代与外部迭代的真正好处是什么,以及为什么使用内部操作更好(至少我是这么听说的)。 是否也可以在内部迭代集合时删除集合的元素?就像在代码示例中一样:
我知道内部迭代的代码可读性更好,但是还有其他一些好处比如性能提升吗?
//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;
}
}
所以我要在这里打断你 - 你的术语没有任何意义。您可能试图了解的是内循环的概念,即有效地在迭代内部迭代,很像模拟手表。
你的代码只有一个循环。这是while
循环,也就是它。这使您的问题的那一部分……实际上没有实际意义。您可以根据需要或需要多次迭代一个集合或集合的集合(集合的集合...)。
否则,这是在迭代集合时从集合中删除元素的正确方法;任何其他方法都会让你 a ConcurrentModificationException
。如果您想将其称为性能优势,那么当您想以这种方式删除元素时,您将受益于不会抛出异常。
你的条件有点简单,因为你可以简单地使用 aList.remove("Orange")
resp。 aList.removeAll(Collections.singleton("Orange"))
相反,但是有一个内部迭代的替代方案,它也适用于更复杂的条件,aList.removeIf(str -> str.equals("Orange"))
。
在 ArrayList
的情况下,这将立即显示内部迭代的优势:在 Iterator
上调用 remove()
的情况下,ArrayList
无法控制在循环中,因此不知道你什么时候退出它。放弃了Iterator
。您可以随时通过 List
接口访问列表,读取并继续迭代或写入而不进一步迭代。
因此每次调用 remove()
时,列表都必须处于一致状态,即在删除元素时必须将所有后续元素复制到正确的位置。这给出了迭代并从 ArrayList
中移除最坏的 O(n²)
时间复杂度的情况。
相比之下,removeIf
方法只需要在returns方法时提供List
的完成状态。因此,它可能会将复制元素推迟到最终位置已知时,这使其成为 O(n)
操作。因此,对于大型列表,具有显着的性能优势。
通常,具有内部迭代的方法提供了针对特定内部数据结构优化实现的可能性,同时永远不会比外部循环差,因为基于迭代器的循环无论如何都是这些方法的后备。