【问题标题】:What object is returned by LinkedList.iterator()?LinkedList.iterator() 返回什么对象?
【发布时间】:2019-11-19 11:03:24
【问题描述】:

将这些视为对象:

Iterator<String> j = LinkedList.iterator();

查看java文档,对于LinkedList类,LinkedList类中没有迭代器方法的实现,但是,实现在AbstractSequentialList类中。

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

listIterator() 方法在 AbstractList 类中实现,该类是 AbstractSequentialList 的父类,如果我没记错的话,它返回一个不使用节点概念的迭代器对象。

   public ListIterator<E> listIterator() {
    return listIterator(0);
}
private class ListItr extends Itr implements ListIterator<E> {
    ListItr(int index) {
        cursor = index;
    }

但是listIterator(int index)方法是在LinkedList类中实现的,并且使用了节点的概念。

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

private class ListItr implements ListIterator<E> {
    private Node<E> lastReturned;
    private Node<E> next;
    private int nextIndex;
    private int expectedModCount = modCount;

那么回到j,它是来自“根”类AbstractList的迭代器还是使用了实现LinkedList类?

【问题讨论】:

  • 好吧,你应该再看看多态性和方法覆盖的概念。 iterator() 的基本实现将调用listIterator(),而后者又调用listIterator(0)。因此,如果 LinkedList 覆盖了最后一个方法,则在 LinkedList 上调用 iterator() 将调用覆盖的方法,因此将返回 LinkedList.ListItr
  • ListItr implements ListIterator&lt;E&gt; 我会推荐composition 而不是inheritence
  • @Thomas 哦,好吧,我现在明白了。我虽然覆盖方法的唯一方法是使用覆盖注释。
  • @HynekHrabík 作为注解@Override 对JVM 执行代码的方式没有影响。直到第六版(即第七版)才添加它。
  • @Override 更多地是向开发人员或编译器提供的信息,即方法意味着覆盖(并且从 Java 6 开始实现)方法。这样,如果在实际上没有覆盖/实现任何东西的方法上存在该注释(或者如果启用,则该注释丢失),编译器可以抱怨。这有助于开发人员更快地发现错误,因为一个方法可能看起来会覆盖另一个方法,但实际上并没有出于各种可能的原因。

标签: java iterator


【解决方案1】:

好吧,既然iterator() 返回listIterator()listIterator() 返回listIterator(0),并且listIterator(int index)LinkedList 覆盖,LinkedListiterator() 方法返回LinkedList$ListItr 的一个实例。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-29
    • 2020-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多