带有LinkedList的foreach循环如何表现?

时间:2013-09-02 00:01:03

标签: java linked-list

我不确定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");

..它会返回第一个红苹果还是最后一个?如果没有,它的表现究竟如何?

3 个答案:

答案 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()

它的文档说明:

  

返回此列表中元素的迭代器(正确   序列)。

所以是的,你会得到第一个红苹果。