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

时间:2017-06-22 11:16:54

标签: java interface linked-list iterator iterable

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

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

因为Iterable是一个接口而不是像LinkedList这样的类,所以它必须实现了一个默认的迭代器,不是吗? 如果理解正确,我在哪里可以看到实施?

4 个答案:

答案 0 :(得分:3)

  

因为Iterable是一个接口,而不是像LinkedList这样的类   必须实现默认迭代器,不是吗?

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

看看这个:

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 {
    // ...
}

注意C类如何编译甚至thoe(冗余)实现Ifoo但不会覆盖getFoo方法(只能是cos C extends A

该课程如下:

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

所以在类层次结构中它看起来像 enter image description here

AbstractCollection的外观如下:

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

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

中的方法

答案 1 :(得分:1)

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

答案越长,LinkedList本身不需要实现iterator()方法,如果它继承自可能实现它的另一个类。如果仔细观察javadoc for LinkedList,您可以看到LinkedList没有定义iterator()方法,但是当您实现Iterable时,它应该在那里。查看结尾,您还可以看到继承方法的部分。具体来看&#34;从类java.util.AbstractSequentialList&#34;继承的方法,其中列出了iterator()

现在我们确定iterator实际上在java.util.AbstractSequentialList。因此,要查找实现,您可以查看AbstractSequentialList的{​​{3}}:

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

现在您看到实现取决于listIterator()的实现。 LinkedList没有实现listIterator()方法(它有一个带有一个参数,但这需要无参数方法)。因此,再次查看javadoc,我们可以在&#34;下继承自类java.util.AbstractList&#34; listIterator()方法是从那里继承的。所以查看AbstractList中的source code

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

现在,listIterator(int)类已在LinkedList类中实现。来自LinkedList的{​​{3}}:

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

如果您需要进一步分析它的作用,您可以从那里继续。

答案 2 :(得分:0)

您将在Linked List类本身中找到可迭代接口方法的实现。

答案 3 :(得分:0)

所以LinkedList类扩展了AbstractSequentialList类。这个类有一个被称为迭代器的方法。由于LinkedList退出了AbstractSequentialList类,我们可以使用迭代器方法。

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

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

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