当前位置: 首页 > 面试题库 >

内部迭代的好处

钱跃
2023-03-14
问题内容

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

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

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

问题答案:

您的情况有些简单,因为您可以简单地使用aList.remove("Orange")resp。aList.removeAll(Collections.singleton("Orange"))而是使用内部迭代的替代方法,它也可以处理更复杂的条件aList.removeIf(str -> str.equals("Orange"))

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

因此,每次调用时remove(),列表都必须进入一致状态,即,删除元素时,所有后续元素都必须复制到正确的位置。这样可以迭代并消除ArrayListO(n²)复杂的时间复杂度。

相反,该removeIf方法仅需List在方法返回时提供的完整状态。因此,当最终位置已知时,它可以将复制元素推迟到该点,从而使其成为一项O(n)操作。因此,对于大型列表,存在明显的性能优势。

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



 类似资料:
  • 我在考虑制作一个动画,例如,一个圆圈从屏幕/网站的顶部下降到底部,然后开始无休止地旋转。我有这个想法,但我不知道如何用CSS来描述它。 这就是我到目前为止所做的事情,我被卡住了: 我不知道如何在“100%”步骤中进行迭代。请给我一些建议

  • 我想单独打印ArrayList中的每个值,即{1=[A,B,C,D],2=[E,F,G,H]} 如果用户输入2(即键),则输出应为E F G H

  • 我试图理解外部迭代器和内部迭代器的区别,外部迭代器使用迭代器来枚举它的元素 上面的代码在后台执行如下操作: 但是对于内部迭代,一切都在后台完成,这对我来说是一个黑匣子,我想深入研究它。 就像下面的代码一样,迭代是在后台发生的,但到底发生了什么,以及与foreach循环相比有什么不同? 这是我对外部和内部迭代的理解,如果我错了,请指正。

  • 我有一个包含私有可变数据列表的类。 我需要在以下条件下公开列表项: 列表不应在外部可修改; 对于使用 getter 函数的开发人员来说,应该很清楚,他们获得的列表不能被修改。 哪个getter函数应该标记为推荐方法?或者您能提供更好的解决方案吗? UPD:这个问题来自关于列表getter实现的最佳实践的真正代码审查讨论

  • 使用SpringMVC和Thymeleaf,我正在构建一个包含一些javascript的html视图。 在页面中,th: each与迭代值一起使用,为一组按钮提供唯一的超文本标记语言id。 我的问题出现在尝试生成javascript时,该javascript将对每个按钮id使用jQuery引用。 在另一种视图解析语言中,我会使用代码: (以上可能不是100%语法正确,但我希望你明白——我试图做的是

  • 本文向大家介绍详解Python中的内建函数,可迭代对象,迭代器,包括了详解Python中的内建函数,可迭代对象,迭代器的使用技巧和注意事项,需要的朋友参考一下 Python中的内建函数和可迭代对象,迭代器 求值标识 id() #标识id 返回对象的唯一标识,CPython返回内存地址 hash() #哈希, 返回对象的哈希值 len(s) -->返回一个集合类型的元素个数 range(start,