今天,当我得到一段已经使用过数百次的代码时,我很乐意编写代码:
迭代集合(此处为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) {
}
答案 0 :(得分:98)
当你需要元素的索引时,第一个是有用的。这基本上等同于ArrayList
s的其他两个变体,但如果使用LinkedList
则会非常慢。
当您不需要元素的索引但在迭代时可能需要删除元素时,第二个很有用。但这样做的缺点是IMO有点过于冗长。
第三个版本也是我的首选。它很简短,适用于您不需要任何索引或底层迭代器的所有情况(即您只访问元素,不删除它们或以任何方式修改Collection
- 这是最常见的情况)。
答案 1 :(得分:35)
所有这些都有自己的用途:
如果您有一个可迭代的并且需要无条件地遍历所有这些:
for(iterable_type iterable_element:collection)
如果您有可迭代但需要有条件地遍历:
for(Iterator iterator = collection.iterator(); iterator.hasNext();)
如果数据结构不实现可迭代:
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);
}