内部迭代的好处

Der*_*erl 0 java iteration internals java-stream

我只是想知道,内部迭代与外部迭代的真正好处是什么,以及为什么最好使用内部操作(至少我听到的是这样)。是否也可以在内部迭代集合时删除集合的元素?就像在代码示例中一样:

我知道内部迭代的代码可读性更好,但是还有其他一些好处,比如性能改进吗?

//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;
         }
      }
Run Code Online (Sandbox Code Playgroud)

Hol*_*ger 5

您的情况有些简单,因为您可以简单地使用aList.remove("Orange")resp. aList.removeAll(Collections.singleton("Orange"))相反,但有一个内部迭代的替代方案,它也适用于更复杂的条件,aList.removeIf(str -> str.equals("Orange"))

在情况下ArrayList,这将立即显示出内部迭代中的优势:在调用的情况下remove()Iterator,在ArrayList拥有循环中没有控制,当你RESP退出它,因此不知道。放弃Iterator. 您可以随时通过List界面访问列表,读取并继续迭代或写入而不进一步迭代。

因此,每次调用时remove(),列表都必须处于一致状态,即在删除元素时必须将所有后续元素复制到正确的位置。这提供了迭代并从时间复杂度ArrayList的最坏情况中移除O(n²)

相比之下,该removeIf方法只需提供List方法返回时的完成状态。因此,它可能会将复制元素推迟到知道最终位置的时间点,这使其成为一项O(n)操作。因此,对于大型列表,具有显着的性能优势。

通常,具有内部迭代的方法提供了针对特定内部数据结构进行优化实现的可能性,而绝不会比外部循环差,因为基于迭代器的循环无论如何都是这些方法的后备。