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
– 这是最常见的情况)。
他们都有自己的用途:
-
如果你有一个迭代器,并且需要无条件地遍历它们:
for(iterable_type iterable_element:collection)
-
如果你有一个迭代,但需要条件遍历:
for(Iterator iterator = collection.iterator(); iterator.hasNext();)
-
如果数据结构没有实现迭代:
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); }