我不确定在foreach循环中LinkedList的行为。例如:
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");
它会退回第一个红苹果还是最后一个?如果没有,它究竟会如何表现?
增强的for循环的行为就像迭代器从列表的开头一直到结尾。它将作用于符合您条件的第一个元素。
对于任何属于Iterable
亚型的事物都是如此;即任何能够产生Iterator
的东西。因此,涵盖了Collection
类。
图示:你的增强版是在封面下做的:
for(Iterator<Apple> iterator = apples.iterator(); iterator.hasNext();) {
Apple apple = iterator.next();
if(apple.getColour().equals(colour)) {
dosomething();
return apple;
}
}
LinkedList<E>
是一个具有定义顺序的容器:它的迭代顺序与项目添加到列表中的顺序相对应。由于for
循环在找到所需颜色的苹果后立即终止,因此将返回第一个红色苹果。当然,如果列表中不包含红苹果,则会返回null
。
其他类型的列表(例如数组列表)也是如此。但是,其他容器的行为可能有所不同。例如,TreeSet<E>
将以可能不同于插入顺序的方式对其元素进行排序;HashSet<E>
将以任意顺序返回其元素,依此类推。
for each循环使用Iterable接口的迭代器方法来获取要迭代的集合的迭代程序。如果您查看LinkedList的Javadoc,您会发现它的迭代器()方法是从AbstractSequenceList类继承的:http://docs.oracle.com/javase/6/docs/api/java/util/AbstractSequentialList.html#iterator()
其文件说明:
返回此列表中元素的迭代器(正确序列)。
是的,你会得到第一个红苹果。