Java:遍历集合的最佳方式(此处为ArrayList)

Java:遍历集合的最佳方式(此处为ArrayList),java,collections,for-loop,Java,Collections,For Loop,今天,当我看到一段我已经使用了数百次的代码时,我正在愉快地编写代码: 遍历集合(此处为ArrayList) 出于某种原因,我实际上查看了Eclipse的自动完成选项,它让我想知道: 以下循环比其他循环更适合使用哪些情况? 经典的数组索引循环: for (int i = 0; i < collection.length; i++) { type array_element = collection.get(index); } 我最喜欢的是因为它写起来很简单: for (iterable

今天,当我看到一段我已经使用了数百次的代码时,我正在愉快地编写代码:

遍历集合(此处为ArrayList)

出于某种原因,我实际上查看了Eclipse的自动完成选项,它让我想知道:

以下循环比其他循环更适合使用哪些情况?

经典的数组索引循环:

for (int i = 0; i < collection.length; i++) {
  type array_element = collection.get(index);
}
我最喜欢的是因为它写起来很简单:

for (iterable_type iterable_element : collection) {

}

它们都有自己的用途:

  • 如果您有一个iterable,并且需要无条件遍历所有iterable:

    用于(iterable\u类型iterable\u元素:集合)

  • 如果您有一个iterable,但需要有条件地遍历:

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

  • 如果数据结构未实现iterable:

    for(int i=0;i

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


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

    第一个在需要元素索引时也很有用。这基本上相当于
    ArrayList
    s的其他两个变体,但是如果使用
    LinkedList
    ,速度会非常慢

    当您不需要元素的索引,但可能需要在迭代过程中删除元素时,第二种方法非常有用。但在我看来,这样做的缺点是有点过于冗长


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

    第一个选项的性能更好(因为ArrayList实现了RandomAccess接口)。根据java文档,如果对于类的典型实例,此循环:

     for (int i=0, n=list.size(); i < n; i++)
         list.get(i);
    
     for (Iterator i=list.iterator(); i.hasNext(); )
         i.next();
    
    我希望有帮助。 对于顺序访问列表,第一个选项的速度较慢。

    以下是一个示例

    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);
    
                 }
    
    Query Query=em.createQuery(“来自学生”);
    java.util.List List=query.getResultList();
    对于(int i=0;i
    在Java 8中还增加了集合的stream()util

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


    有关Java 8流和Wonders集合的更多信息

    在我看来,我主要使用第三个循环。对于第二种方法,最好使用:
    for(Iterator Iterator=collection.Iterator();Iterator.hasNext();){type=Iterator.next();}
    集合接口不包含方法“get”,所以第一个并不总是可能的。同样在第一个选项中,对于“for循环”,collection.length应该更改为collection.size()+1。我们将提到LinkedList(并非所有的
    集合
    通过索引检索都很便宜)。只要只需要循环元素,使用第三版总是好的,因为实现已经存在于所有不同的集合中,Sun或任何JDK实现都在努力提高性能,而不是每一个。@Phani:其他两个变体也适用于任何JDK实现。我没有说这些都不起作用,但是,如果集合的实现有某种改进或性能改变,那么它将自动应用于您的代码,您不需要编写代码来提高性能,这就是我的意思。@Phani:AFAIK第三种形式仅仅是第二种形式的语法糖(即,在引擎盖下,foreach变量实际上使用了迭代器)。因此,任何性能优势都应该对这两个变量都可用。当然,第一个版本不会获得任何性能优势(例如,如果将
    列表
    实现为一个树,它实际上会更慢).if(iterable_element.some_attribute){//do something;}else{//do nothing;}可以有条件地遍历第一个方法吗。如果是,则第一个和第二个方法之间基本上没有区别,除了语法上的糖。1与其他方法一样,使用
    break
    和/或
    continue
    collection.forEach((temp) -> {
                System.out.println(temp);
    });
    
    collection.forEach(System.out::println);