【问题标题】:Does LinkedList in Java have a default iterator implemented?Java 中的 LinkedList 是否实现了默认迭代器?
【发布时间】:2017-11-25 15:22:26
【问题描述】:

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

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

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

【问题讨论】:

    标签: java interface linked-list iterator iterable


    【解决方案1】:

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

    请注意,即使(冗余)实现 Ifoo 但不会覆盖 getFoo 方法(因为 C extends A 这只是可能的),c 类也能很好地编译


    类看起来像:

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

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

    AbstractCollection 的样子:

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

    所以他们确实会覆盖 interface Iterable&lt;T&gt; 中的方法

    【讨论】:

    • 好吧,它不需要实现方法beeing abstract。实际上,它的AbstractSequentialList 真正实现了Iterator 以重定向到ListIterator 接口(在AbstractList 中实现)。
    【解决方案2】:

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

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

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

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

    现在你看到实现依赖于listIterator() 的实现。 LinkedList 没有实现 listIterator() 方法(它只有一个参数,但需要无参数方法)。因此,再次查看 javadoc,我们可以在“从类 java.util.AbstractList 继承的方法”下找到 listIterator() 方法是从那里继承的。所以看看AbstractList中的source code

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

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

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

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

    【讨论】:

    • 我知道你可以实现自己的迭代器(我已经为大学的一门学科做过,但该课程不是 LinkedList),但我完全不确定LinkedList,现在我是
    【解决方案3】:

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

    【讨论】:

    • 好的,但也许您应该包含一些代码以使其成为真正的答案。
    【解决方案4】:

    所以 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{
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-01-22
      • 2015-05-26
      • 1970-01-01
      • 2021-09-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多