Java 中的 LinkedList 是否实现了默认迭代器?

Does LinkedList in Java have a default iterator implemented?

我正在研究 Java classes 和继承,我对接口有疑问。

LinkedList class 根据 Oracle 文档实现 Serializable、Cloneable、Iterable、Collection、Deque、List、Queue。

因为 Iterable 是一个接口而不是像 LinkedList 那样的 class,它一定已经实现了一个默认的迭代器,不是吗? 如果理解正确,我在哪里可以看到实现?

Because Iterable is an interface and not a class like LinkedList, it must have implemented a default iterator, mustn´t it?

不是真的,如果超级 class 确实覆盖了该方法,那么子 class 就不必...

看看这个:

interface IFoo {
    int getFoo();
}

class A implements IFoo {

    @Override
    public int getFoo() {
        // TODO Auto-generated method stub
        return 0;
    }
}

class B extends A {
    // ...
}
class C extends A implements IFoo {
    // ...
}

注意 Class c 如何编译得很好,即使你(冗余地)实现了 Ifoo 但没有覆盖 getFoo 方法(这是唯一可能的 cos C extends A


class 看起来像:

public class LinkedList<E>
    extends AbstractSequentialList<E>
    implements List<E>, Deque<E>, Cloneable, java.io.Serializable
{

所以在 class 层次结构中它看起来像

AbstractCollection 看起来像:

 public abstract class AbstractCollection<E> implements Collection<E> {

所以他们确实覆盖了 interface Iterable<T>

中的方法

您将在链表 class 本身中找到可迭代接口方法的实现。

简短的回答是,在源代码中。

较长的答案是 LinkedList 如果它继承自另一个可能实现它的 class 方法,则它本身不需要实现 iterator() 方法。如果你仔细观察 javadoc for LinkedList,你会发现 LinkedList 没有定义 iterator() 方法,但是当你实现 Iterable 时它应该在那里。看看最后你还可以看到继承方法的部分。具体看"Methods inherited from class java.util.AbstractSequentialList",其中列出了iterator()

所以现在我们确定 iterator 实际上在 java.util.AbstractSequentialList 中。因此,要找到实现,您可以查看 AbstractSequentialListsource code,即:

public Iterator<E> iterator() {
    return listIterator();
}

现在如您所见,实施取决于 listIterator() 的实施。 LinkedList 没有实现 listIterator() 方法(它有一个带有一个参数的方法,但这需要无参数方法)。所以再看javadoc我们可以发现在"Methods inherited from class java.util.AbstractList"下,listIterator()方法是从那里继承的。所以从 AbstractListsource code

public ListIterator<E>  listIterator() {
    return listIterator(0);
}

现在,listIterator(int)方法在LinkedListclass中实现。来自LinkedListsource code

 public ListIterator<E>  [More ...] listIterator(int index) {
     checkPositionIndex(index);
     return new ListItr(index);
 }

如果您需要进一步分析是做什么的,可以从那里继续。

因此 LinkedList class 扩展了 AbstractSequentialList class。此 class 具有称为迭代器的方法。由于 LinkedList 扩展了 AbstractSequentialList class 我们可以使用迭代器方法。

public abstract class AbstractSequentialList<E>
extends AbstractList<E>{
  public Iterator<E> iterator(){
    //implementation
 }
}

现在 LinkedList class 扩展了 AbstractSequentialList class。因此,通过创建 LinkedList class 的对象,我们可以使用迭代器方法。

public class LinkedList<E>
extends AbstractSequentialList<E>
implements List<E>, Deque<E>, Cloneable, Serializable{
}