【问题标题】:Benefits of internal iterations内部迭代的好处
【发布时间】:2019-11-26 17:50:10
【问题描述】:

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

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

//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;
         }
      }

【问题讨论】:

  • 这段代码没有任何好处。只需使用if (aList.remove("Orange")) System.out.println(...)
  • @AndyTurner:有时,你不能这样做。而“有时”我的意思是“如果你经常使用你无法控制并且没有实现equalshashCode的类。”
  • 如果您好奇您的迭代器与内部迭代器的对比情况,请查看 OpenJDK 源代码,例如。 ArrayList:github.com/openjdk/jdk/blob/…
  • 在流的情况下,您只需使用一个命令即可开始并行处理,例如parallelStream()stream().parallel()

标签: java iteration java-stream internals


【解决方案1】:

所以我要在这里阻止你 - 你的术语没有任何意义。您可能试图了解的是内部循环的概念,它有效地在迭代内部进行迭代,就像模拟手表的表盘一样。 p>

您的代码只有一个循环。这是while 循环,。这使您问题的这一部分……实际上没有实际意义。您可以根据需要或需要多次迭代一个或多个集合(集合...)。

否则,这是在迭代集合时从集合中删除元素的正确方法;任何其他方法都会让你得到a ConcurrentModificationException。如果您想将其称为性能优势,那么当您想以这种方式删除元素时,您将获得不引发异常的好处。

【讨论】:

  • 我复制了代码,只是注意到我没有复制整个重要部分。但是我的问题的重点是,内部迭代与外部迭代的好处是什么,以及是否通常可以在使用内部流迭代集合时删除集合的元素。代码示例可能有点混乱。
【解决方案2】:

您的条件有点简单,因为您可以简单地使用aList.remove("Orange") 。取而代之的是aList.removeAll(Collections.singleton("Orange")),但是有一个内部迭代的替代方案,它也适用于更复杂的条件,aList.removeIf(str -> str.equals("Orange"))

ArrayList 的情况下,这将立即显示内部迭代的优势:如果在Iterator 上调用remove()ArrayList 无法控制循环,因此不知道何时你分别退出它。放弃Iterator。您可以随时通过List接口访问该列表,读取并继续迭代或写入而不进一步迭代。

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-08
    • 1970-01-01
    • 2017-12-17
    • 1970-01-01
    • 2015-09-20
    • 2017-08-10
    相关资源
    最近更新 更多