何时使用for(int i = 0 ;;)/ for-each / iterator来浏览List

时间:2011-08-08 07:33:32

标签: java for-loop foreach iterator

是否优先使用传统的for循环,for-each循环或迭代器来遍历List?

1) for(MyClass mc : al){ // do something on mc }
or

2) iter = arrayList.iterator();
while(iter.hasNext()){MyClass mc = iter.Next()}

9 个答案:

答案 0 :(得分:4)

您可以使用迭代器来避免ConcurrentModificationExceptions。

iter = arrayList.iterator();
while(iter.hasNext()) {
  MyClass mc = iter.next();

  if(shouldItBeRemoved(mc)) {
    iter.remove(); // Will not throw ConcurrentModificationException
    // arrayList.remove(mc); // Will throw CME
  }
}

也就是说,我发现for-each循环更具可读性,所以每当你不修改循环中的列表时都要使用它。

答案 1 :(得分:4)

对于大多数迭代,您应该使用常规循环:

for (Object o : list) { /* */ }

它更具可读性,意图清晰,潜在的错误保持在最低限度。

当您需要显式控制迭代时使用迭代器,例如,当您可能想要重新开始迭代时。

答案 2 :(得分:2)

我的偏好是

1)如果我需要向前推进列表而不对List对象进行任何修改,那么对于可读和干净的代码,我将使用:

for(MyClass mc : list){
    /* code without modification to list */
}

2)如果我需要修改List对象,毫无疑问我将使用:

iter = list.iterator();
while(iter.hasNext()) {
    MyClass mc = iter.next()
    /* code without modification to list */
    /* code with modification to list */
}

其他信息:

如果您需要创建一个可以遍历多种类型集合的实用程序方法(例如ArrayList,LinkedList,HashSet,TreeSet,LinkedHashSet),Iterator将非常有用

public class Example {
  public static void iterateAndDoSomething(Iterator<MyClass> iter) {
    while(iter.hasNext()) {
        MyClass mc = iter.next();
        /* code without modification to list */
        /* code with modification to list */
    }
  }

  public static void main(String[] args) {
    ArrayList<MyClass> als = new ArrayList<MyClass>();
    TreeSet<MyClass> tss = new TreeSet<MyClass>();
    iterateAndDoSomething(als.iterator());
    iterateAndDoSomething(tss.iterator());
  }
}

答案 3 :(得分:1)

某些类没有iterator()方法(例如NodeList),那么您必须使用#1。除此之外,我认为这是一个偏好的问题。

答案 4 :(得分:1)

如果我在循环期间需要索引,则使用for (i=0;,如果它是唯一可能的事情,则使用iterator(),或者我需要remove()个元素(并发)。对于所有其他情况,我使用缩短的for循环for(MyClass mc : al),因为它具有可读性。

答案 5 :(得分:1)

传统循环(基于索引)在需要索引来操作数组时非常有用。

如果你不关心索引,你感兴趣的只是从数组中获取值,for..each循环是最合适的。

某些Collection对象没有提供使用index获取值的方法,在这种情况下,iterator()是唯一的选项。

答案 6 :(得分:0)

根据您提供的代码片段,很明显,for-each迭代会产生更清晰的代码。

如果存在两者,您可以灵活选择想要的内容。

答案 7 :(得分:0)

Java 1.4上没有for-each-loop,所以如果你需要支持Java&lt; 1.5,这可能会被淘汰。

另外两个选择是我认为的用例和风格问题。迭代器通常看起来更干净,但您可能还需要一个计数器变量,因此for循环可能更适合您的需求。另外,一些列表实现不提供迭代器,因此您必须使用索引。

答案 8 :(得分:-1)

我已经读过迭代器在Swing中非常有用,特别是如果你在paintComponent(Graphics g)方法中迭代集合。

迭代器的好处是,您可以从多个线程迭代同一个集合,甚至可以使用方法remove()删除该集合的元素,同时在其他地方同时访问该集合。

  

如果是底层的,则未指定迭代器的行为   在迭代以任何方式进行时,都会修改集合   除了通过调用此方法。   这意味着如果同时修改同一个集合,则不会定义方法remove的行为。但是方法删除效果很好即使你在调用iterator.remove()的同时遍历同一个集合也是如此!我在我的GUI中使用过它。

根据我的经验,有必要在方法paintComponent中使用迭代器,而不是循环forfor-each