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
中。因此,要找到实现,您可以查看 AbstractSequentialList
的 source code,即:
public Iterator<E> iterator() {
return listIterator();
}
现在如您所见,实施取决于 listIterator()
的实施。 LinkedList
没有实现 listIterator()
方法(它有一个带有一个参数的方法,但这需要无参数方法)。所以再看javadoc我们可以发现在"Methods inherited from class java.util.AbstractList"下,listIterator()
方法是从那里继承的。所以从 AbstractList
看 source code:
public ListIterator<E> listIterator() {
return listIterator(0);
}
现在,listIterator(int)
方法在LinkedList
class中实现。来自LinkedList
的source 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{
}
我正在研究 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
中。因此,要找到实现,您可以查看 AbstractSequentialList
的 source code,即:
public Iterator<E> iterator() {
return listIterator();
}
现在如您所见,实施取决于 listIterator()
的实施。 LinkedList
没有实现 listIterator()
方法(它有一个带有一个参数的方法,但这需要无参数方法)。所以再看javadoc我们可以发现在"Methods inherited from class java.util.AbstractList"下,listIterator()
方法是从那里继承的。所以从 AbstractList
看 source code:
public ListIterator<E> listIterator() {
return listIterator(0);
}
现在,listIterator(int)
方法在LinkedList
class中实现。来自LinkedList
的source 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{
}