【问题标题】:What is the use-case for Iterator and for loop (not for each) [closed]迭代器和 for 循环的用例是什么(不是每个)[关闭]
【发布时间】:2013-12-17 02:17:07
【问题描述】:

Iterator 和 for 循环(不是 for-each 循环)的用例是什么

请举例说明。

【问题讨论】:

  • 什么“老循环”? “迭代器”有什么用?一些小例子将有助于澄清问题。
  • 简单的 for 循环。 for(int i ; i
  • 把它放在帖子里 - 编辑它:) 另外,这只是关于“旧循环”还是"new enhanced loop"
  • 因为它有一个目的。想象有一个链接列表。您真的想使用“旧循环”对其进行迭代吗?那将是非常低效的!或者 HashMap 怎么样?既然没有 [直接] 索引,人们将如何迭代它?
  • Iterable 对于使用 for-each 循环是特别必要的。除非类实现 Iterable,否则不能使用 for-each。

标签: java


【解决方案1】:

除了迭代器可以在获取它之前检查是否有下一个元素 (hasNext()) 之外 - 它还可以从集合中删除一个元素。如果您在循环中运行并尝试删除一个元素 - “下一个”元素应该是什么?

Iterator 接口(及其子接口)实现提供了一种简单、安全、快速故障的非同步机制来修改和迭代集合。它节省了自己实现它的样板,并为开发人员提供了一个高效且无错误的工具。

Foreach 循环是由迭代器实现的,因此通过使用它,您不会做任何不同的事情 - 当您只需要一个简单的“只读”迭代时,它是一个很好的工具。

【讨论】:

  • 简单来说,它在发布之前经过了彻底的测试,因此比传统的 for.loop =]
【解决方案2】:

你不喜欢简单吗?当你被介绍到闭包这个话题时,你会说什么?你会像回避基于集合的 for 循环一样回避它吗?

代码越“紧凑”,就越容易理解,也更容易维护。

for(String each : anArrayList){
    // do something
}

for(int i = 0; i < anArrayList.size(); i++){
    // do something
}  

第一个使用迭代器,而第二个使用更“传统”的 for 循环。程序员想要做什么的意图在第一个中变得更加清晰。另外,它更容易理解。

此外,您不仅可以遍历,还可以在迭代时做很多事情。就像从集合中删除一个元素,将其添加到另一个元素,对其执行计算等等......

SSCCE:

import java.util.Iterator;
import java.util.List;
import java.util.Vector;

public class AnIterator {
    public static void main(String[] args) {
        List<String> list1 = new ArrayList<>(); 
        List<String> list2 = new ArrayList<>();

        list1.add("One");
        list1.add("Two");
        list1.add("Three");
        list1.add("Four");
        list1.add("Five");

        Iterator it = list1.iterator();
        while(it.hasNext()){
            String next = (String) it.next();
            String temp = next.toLowerCase();
            char x = temp.charAt(0);
            if(x == 'a' || x == 'e' || x == 'i' || x == 'o' || x == 'u'){
                it.remove();
                list2.add(next);
            }
        }

        System.out.println("Vowels: " + list2);
        System.out.println("Consonants: " + list1);

    }
}  

SSCCE 展示了如何使用 Iterator 从集合中删除元素。比传统的 for 循环更容易理解吗? =)

对比一下:

for(int i = 0; i < list1.size(); i++){
            String element = list1.get(i);
            String temp = element.toLowerCase();

            // same logic goes here

}  

迭代器更优雅?

【讨论】:

    【解决方案3】:

    如果一个类是可迭代的,那么我们知道我们可以获得一个迭代器并使用该迭代器来导航数据结构。我们不需要知道类是什么样子或者它是如何工作的等等。我们只需要知道迭代器的方法。

    【讨论】:

      【解决方案4】:

      据我所知,foreach 循环也在使用内部迭代器。

      这对你来说也可能很有趣:Performance of traditional for loop vs Iterator/foreach in Java

      【讨论】:

        【解决方案5】:

        如果您想在遍历集合时删除项目,可以使用迭代器。 For 循环只是为了减少代码大小和代码可读性,如果不需要任何特定的迭代器功能。

        for(Iterator<Integer> iter = list.iterator(); iter.hasNext(); )
        {
            int nextInt = iter.next();
            if(nextInt==0)
            {
                iter.remove();
            }
        }
        

        【讨论】:

        • 遍历时无法从循环中移除元素?
        • 这取决于集合的实现,一般认为用迭代器删除是安全的。
        • 当一个迭代器修改集合的结构而另一个迭代器迭代它时,仅在多线程环境中是不安全的。这样的行为会导致 ConcurrentModificationException
        猜你喜欢
        • 1970-01-01
        • 2018-07-05
        • 2022-10-15
        • 2016-06-20
        • 1970-01-01
        • 2017-10-25
        • 2013-04-24
        • 2015-03-15
        • 2014-09-20
        相关资源
        最近更新 更多