为了账号安全,请及时绑定邮箱和手机立即绑定

哪一个更有效,一个for-每个循环,还是一个迭代器

哪一个更有效,一个for-每个循环,还是一个迭代器

Go
慕田峪7331174 2019-12-16 12:12:00
哪一个更有效,一个for-每个循环,还是一个迭代器?哪一种方式是遍历集合最有效的方法?List<Integer>  a = new ArrayList<Integer>();for (Integer integer : a) {   integer.toString();}或List<Integer>  a = new ArrayList<Integer>();for (Iterator iterator = a.iterator(); iterator.hasNext();) {    Integer integer = (Integer) iterator.next();    integer.toString();}请注意,这不是与这,这个, 这,这个, 这,这个,或这,这个虽然最后一个问题的答案之一已经接近尾声。这不是一个欺骗的原因,因为其中大多数都是比较循环,您在其中调用。get(i)循环内部,而不是使用迭代器。如上所建议的元我将张贴我对这个问题的答案。
查看完整描述

3 回答

?
繁花如伊

TA贡献2012条经验 获得超12个赞

区别不在于性能,而在于能力。当直接使用引用时,您比显式使用迭代器(例如List.iterator()与List.listIterator(),尽管在大多数情况下它们返回相同的实现)更强大。您还可以在循环中引用Iterator。这允许您在不获取ConcurrentModificationException的情况下从集合中删除项。

G.

这没问题:

Set<Object> set = new HashSet<Object>();// add some items to the setIterator<Object> setIterator = set.iterator();while(setIterator.hasNext()){
     Object o = setIterator.next();
     if(o meets some condition){
          setIterator.remove();
     }}

这不是,因为它将引发并发修改异常:

Set<Object> set = new HashSet<Object>();// add some items to the setfor(Object o : set){
     if(o meets some condition){
          set.remove(o);
     }}



查看完整回答
反对 回复 2019-12-19
?
慕仙森

TA贡献1827条经验 获得超7个赞

为了扩展Paul自己的答案,他已经证明了字节码在特定的编译器上是相同的(大概是Sun的javac?)但是不同的编译器不是生成相同的字节码,对吗?为了了解两者之间的实际区别,让我们直接进入源代码,检查Java语言规范,特别是14.14.2,“强化陈述”:

增强for语句等效于基本语句。for表格说明:

for (I #i = Expression.iterator(); #i.hasNext(); ) {
    VariableModifiers(opt) Type Identifier = #i.next();    
    Statement }

换句话说,JLS要求两者是等价的。从理论上讲,这可能意味着字节码的边际差异,但实际上,增强的for循环需要:

  • 调用

    .iterator()

    方法
  • 使用

    .hasNext()

  • 通过以下方式使局部变量可用

    .next()

因此,换句话说,就所有实际目的而言,字节码将是相同的,或几乎相同的。很难想象编译器实现会导致两者之间的任何显著差异。



查看完整回答
反对 回复 2019-12-19
  • 3 回答
  • 0 关注
  • 685 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信