Java:迭代通过一个集合的最佳方式(这里是ArrayList)

今天,当我遇到一段我已经使用了数百次的代码时,我开心地编写代码:

迭代一个集合(这里是ArrayList)

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

以下哪些环路比其他环路更适合使用?

经典的数组索引循环:

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

迭代器hasNext()/ next():

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

而我最喜欢的是因为它写得这么简单:

 for (iterable_type iterable_element : collection) { } 

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

当你不需要元素的索引时,第二个是有用的,但是当你迭代时可能需要删除元素。 但是这有一个过于冗长的国际海事组织的缺点。

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

他们都有自己的用途:

  1. 如果你有一个迭代器,并且需要无条件地遍历它们:

    for(iterable_type iterable_element:collection)

  2. 如果你有一个迭代,但需要条件遍历:

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

  3. 如果数据结构没有实现迭代:

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

还有Java 8的collections()util()util

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

有关Java 8stream和更多关于wonderers集合的信息链接

没有一个比其他人“更好”。 第三,对我来说,更具可读性,但是对于不使用恶意的人来说,它可能看起来很古怪(他们可能更喜欢第一个)。 对于懂Java的人来说,所有这三个都是相当清楚的,所以select一个让你感觉更好的代码。

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

第一个选项是更好的性能明智(因为ArrayList实现RandomAccess接口)。 根据java文档,如果对于类的典型实例,一个List实现应该实现RandomAccess接口:

  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); }