我不确定foreach循环中的LinkedList行为。 e.g:
LinkedList<Apple> apples = new LinkedList<Apple>();
public Apple apple(String colour) {
for (Apple apple : apples) {
if (apple.getColour().equals(colour)) {
dosomething();
return apple;
}
}
return null;
}
想象一下,列表中有许多红苹果,而不是任何特定的顺序。当这样调用时:
apple("Red");
..它会返回第一个红苹果还是最后一个?如果没有,它的表现究竟如何?
答案 0 :(得分:5)
增强型for循环表现为just like an iterator从列表的开头到结尾。它将作用于符合您条件的第一个元素。
任何属于Iterable
的子类型的情况都是如此;也就是说,任何可以产生Iterator
的东西。因此,涵盖了Collection
类。
插图:你的增强版是在幕后做的:
for(Iterator<Apple> iterator = apples.iterator(); iterator.hasNext();) {
Apple apple = iterator.next();
if(apple.getColour().equals(colour)) {
dosomething();
return apple;
}
}
答案 1 :(得分:1)
LinkedList<E>
是具有已定义顺序的容器:其迭代顺序对应于项目已添加到列表的顺序。由于for
循环在找到所请求颜色的苹果后立即终止,因此将返回第一个红苹果。当然,如果列表中没有红苹果,则会返回null
。
其他类型的列表(例如数组列表)也是如此。但是,其他容器的行为可能不同。例如,TreeSet<E>
将以与插入顺序不同的方式对其元素进行排序; HashSet<E>
将以任意顺序返回其元素,依此类推。
答案 2 :(得分:1)
for each循环使用Iterable接口的迭代器方法来获取正在迭代的集合的迭代器。如果你看一下LinkedList的Javadoc,你会看到它的iterator()方法继承自AbstractSequentialList类:http://docs.oracle.com/javase/6/docs/api/java/util/AbstractSequentialList.html#iterator()
它的文档说明:
返回此列表中元素的迭代器(正确 序列)。
所以是的,你会得到第一个红苹果。