2017-06-22 100 views
0

我正在學習Java類和繼承,並且對接口有疑問。Java中的LinkedList是否實現了默認的迭代器?

LinkedList類根據Oracle文檔實現Serializable,Cloneable,Iterable,Collection,Deque,List,Queue。

因爲Iterable是一個接口而不是像LinkedList這樣的類,它必須實現了一個默認的迭代器,不是嗎? 如果明白了,那我可以在哪裏看到實施?

回答

1

簡短的回答是,在源代碼中。

較長的答案是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()方法是從那裏繼承所以從AbstractListsource code

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

現在,listIterator(int)方法在LinkedList類實現從source codeLinkedList的:

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

如果你需要進一步分析做什麼,你可以繼續從那裏。

+1

我知道你可以實現你自己的迭代器(我在大學爲一個主題做了它,但該類不是LinkedList),但是我不確定LinkedList中的默認實現,現在我 – alberto

3

由於可迭代是一個接口,而不是一類像LinkedList的,它 必須實施一個默認的迭代器,mustn't呢?

不是真的,如果超類不覆蓋的方法則子類不必...

看看這個:

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>

+0

那麼,它不需要實現抽象的方法。實際上,它的'AbstractSequentialList'實際上實現了'Iterator'來重定向到'ListIterator'接口(在AbstractList中實現)。 – AxelH

0

你會在Linked List類中找到iterable接口方法的實現本身。

+0

好的,但也許你應該包括一些代碼,使這是一個真正的答案。 –

0

所以LinkedList類擴展摘要SequentialList類。這個類有被稱爲迭代器的方法。由於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{ 
}