1

我不确定 LinkedList 在 foreach 循环中的行为。例如:

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");

.. 它会返回第一个红苹果还是最后一个?如果不是,它的行为究竟如何?

4

3 回答 3

5

增强型 for 循环的行为就像从列表开头到结尾的迭代器。它将在第一个与您的条件匹配

Iterable任何属于;子类型的东西都是如此。也就是说,任何可以产生Iterator. 所以,Collection类被覆盖了。

插图:您的增强版正在幕后进行此操作:

for(Iterator<Apple> iterator = apples.iterator(); iterator.hasNext();) {
    Apple apple = iterator.next();
    if(apple.getColour().equals(colour)) {
        dosomething();
        return apple;
    }
 }
于 2013-09-02T00:02:28.853 回答
1

LinkedList<E>是一个具有定义顺序的容器:它的迭代顺序对应于项目被添加到列表中的顺序。由于您的for循环在找到所需颜色的苹果后立即终止,因此将返回第一个红色苹果。当然如果列表中不包含红苹果,null将被返回。

其他类型的列表(例如数组列表)也是如此。但是,其他容器的行为可能不同。例如,TreeSet<E>会以不同于插入顺序的方式对其元素进行排序;HashSet<E>将以任意顺序返回其元素,依此类推。

于 2013-09-02T00:05:09.270 回答
1

for each 循环使用 Iterable 接口的迭代器方法来获取您正在迭代的集合的迭代器。如果您查看 LinkedList 的 Javadoc,您会看到它的 iterator() 方法是从 AbstractSequentialList 类继承的:http: //docs.oracle.com/javase/6/docs/api/java/util/AbstractSequentialList.html#迭代器()

它的文档指出:

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

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

于 2013-09-02T00:06:56.670 回答