当前位置: 首页 > 知识库问答 >
问题:

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

颛孙博易
2023-03-14

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

根据Oracle文档,LinkedList类实现了可序列化、可克隆、可重用、集合、定义、列表和队列。

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

共有3个答案

缪修德
2023-03-14

您将在链表类本身中找到iterable接口方法的实现。

苏健柏
2023-03-14

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

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

现在我们已经确定,iterator实际上在java中。util。抽象顺序列表。因此,要找到实现,您可以查看AbstractSequentialList的源代码,它是:

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

现在如您所见,实现依赖于listIterator()的实现。LinkedList没有实现listIterator()方法(它有一个带一个参数的方法,但这需要无参数方法)。所以再次查看javadoc,我们可以在“继承自类java.util.AbstractList的方法”下发现listIterator()方法是从那里继承的。所以查看AbstractList中的源代码:

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

现在,在LinkedList类中实现了listIterator(int)方法。从LinkedList的源代码:

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

如果您需要进一步分析is的功能,可以从那里继续。

宗政海
2023-03-14

因为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类是如何编译的,即使它(冗余地)实现了Ifoo,但没有覆盖getFoo方法(这只可能是因为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中的方法

 类似资料:
  • 它只是说: 返回以此集合为源的顺序流。 当spliterator()方法无法返回不可变、并发或后期绑定的spliterator时,应重写此方法。(有关详细信息,请参见拆分器() 但我找不到任何显示它如何创建和返回新流的代码。 是一个

  • 我想知道gensim的LDA(潜在Dirichlet分配)算法的默认迭代次数。我认为文档中没有提到这一点。(迭代次数由初始化LdaModel时的参数迭代次数表示)。谢谢

  • 当前:Bag$Node@1786F9D5下一个:Bag$Node@704D6E83 看起来很清楚,至少在我看来,下一个节点每次都会设置一个新节点。我将所有四个元素都添加到包中,但条目丢失,并为每个索引返回null。toArray()函数显示 我敢肯定这是一件简单得让人眼花缭乱的事情。下面是整个实现。

  • 问题内容: 如果没有覆盖该方法,默​​认的实现是什么? 问题答案: 然后,此类从其祖先之一继承。如果它们都不覆盖它,则使用Object.hashCode。 从文档: 在合理可行的范围内,由Object类定义的hashCode方法确实为不同的对象返回不同的整数。(通常通过将对象的内部地址转换为整数来实现,但是JavaTM编程语言不需要此实现技术。) 因此默认实现是特定于JVM的

  • 问题内容: 如果我写这样的话 哪种类型带有“ 18”?是 int 还是 byte ?还是还没有类型? 它不能是int,因为这样是正确的: 这是不正确的: 编辑:我想我在工作分配转换的规范中找到了正确的部分: 常量的编译时缩小意味着代码如下: 字节theAnswer = 42; 被允许。如果不进行缩小,则整数文字42具有int类型的事实意味着将需要强制转换为字节: 字节theAnswer =(字节)

  • 问题内容: 我试图理解Java对象的hashCode(),并看到Java对象的hashCode()方法的以下代码: 因此,该类即:将隐式扩展该类。 主班: 正如隐式扩展类一样,因此它将具有类的方法。 我调用了on 对象,但由于尚未覆盖on ,因此从理论上讲它应该调用class的。 我的疑问是: 由于Object类没有任何实现,因此如何计算任何对象的哈希码? 就我而言,当我运行该程序时,它返回的哈希