Java:迭代集合的最佳方式(此处为ArrayList)

时间:2011-03-08 05:25:00

标签: java collections for-loop

今天,当我得到一段已经使用过数百次的代码时,我很乐意编写代码:

  

迭代集合(此处为ArrayList)

由于某种原因,我实际上看了Eclipse的自动完成选项,它让我感到疑惑:

以下循环比其他循环使用的情况更好?

经典数组索引循环:

for (int i = 0; i < collection.length; i++) {
  type array_element = collection.get(index);
}

Iterator hasNext()/ next():

for (Iterator iterator = collection.iterator(); iterator.hasNext();) {
  type type = (type) iterator.next();   
}

而我最喜欢的是因为它写得如此简单:

for (iterable_type iterable_element : collection) {

}

6 个答案:

答案 0 :(得分:98)

当你需要元素的索引时,第一个是有用的。这基本上等同于ArrayList s的其他两个变体,但如果使用LinkedList则会非常慢。

当您不需要元素的索引但在迭代时可能需要删除元素时,第二个很有用。但这样做的缺点是IMO有点过于冗长。

第三个版本也是我的首选。它很简短,适用于您不需要任何索引或底层迭代器的所有情况(即您只访问元素,不删除它们或以任何方式修改Collection - 这是最常见的情况)。

答案 1 :(得分:35)

所有这些都有自己的用途:

  1. 如果您有一个可迭代的并且需要无条件地遍历所有这些:

    for(iterable_type iterable_element:collection)

  2. 如果您有可迭代但需要有条件地遍历:

    for(Iterator iterator = collection.iterator(); iterator.hasNext();)

  3. 如果数据结构不实现可迭代:

    for(int i = 0; i&lt; collection.length; i ++)

答案 2 :(得分:10)

Java 8还有另外的集合'stream()util

collection.forEach((temp) -> {
            System.out.println(temp);
});

collection.forEach(System.out::println);

有关Wonirers link

的Java 8流和集合的更多信息

答案 3 :(得分:4)

他们中没有一个比其他人“更好”。第三,对我来说,更具可读性,但对于不使用foreaches的人来说,它可能看起来很奇怪(他们可能更喜欢第一个)。对于了解Java的人来说,所有3个都非常清楚,所以选择哪个让你对代码感觉更好。

第一个是最基本的,所以它是最通用的模式(适用于数组,我能想到的所有迭代)。这是我能想到的唯一区别。在更复杂的情况下(例如,您需要访问当前索引,或者需要过滤列表),第一种和第二种情况可能分别更有意义。对于简单的情况(可迭代对象,没有特殊要求),第三个似乎是最干净的。

答案 4 :(得分:2)

第一个选项是更好的性能(As ArrayList实现RandomAccess接口)。根据java doc,如果对于类的典型实例,这个循环的List实现应该实现RandomAccess接口:

 for (int i=0, n=list.size(); i < n; i++)
     list.get(i);

比这个循环运行得更快:

 for (Iterator i=list.iterator(); i.hasNext(); )
     i.next();

我希望它有所帮助。 顺序访问列表的第一个选项会很慢。

答案 5 :(得分:1)

这是一个例子

Query query = em.createQuery("from Student");
             java.util.List list = query.getResultList();
             for (int i = 0; i < list.size(); i++) 
             {

                 student = (Student) list.get(i);
                 System.out.println(student.id  + "  " + student.age + " " + student.name + " " + student.prenom);

             }