哪个类实现了迭代器的Next()方法?

时间:2014-01-29 08:31:52

标签: java iterator

我的问题可能是新鲜的,甚至是重复的,但我还没有找到答案。 iterator()方法返回一个迭代器,它有几个方法,比如next()。但这些方法在哪里实施?接口无法实现方法,对吧?

例如:

Set keys = selector.selectedKeys();
Iterator it = keys.iterator();
While (it.hasNext())

另外,it不是对象的引用,对吗?那是什么?

9 个答案:

答案 0 :(得分:4)

你是对的,接口无法实现方法。

接口编程的美妙之处在于您无需担心它们的实现位置。您需要知道的是Set#iterator()返回一个实现Iterator接口的类。这样,如果包含实现的返回类应该更改,这对您的代码无关紧要。

答案 1 :(得分:1)

iterator()实际上将返回Iterator实现,即实现Iterator的类的实例。通常这个类会有所不同,具体取决于您调用的集合iterator()

这是接口的主要优点:它们只定义了一些实现必须遵循的契约(在这种情况下,它定义了几种方法以及它们应该如何表现),但实际上并没有提供该契约的实现,因此可以在适当的位置定义实现。

答案 2 :(得分:1)

如果使用Eclipse之类的IDE,则可以查询实现Iterator的类列表。只需在代码中选择单词Iterator,然后按 Ctrl - t 。其他IDE将有自己的方式来做到这一点。

您将看到Oracle非公共代码(以及您使用的其他库)中包含的无数不同的迭代器。它是从集合中请求迭代器时返回的其中一个类的实例。

要找出与特定对象类型一起使用的特定迭代器,请浏览源代码并亲自查看!或者通过在迭代器实例上调用.getClass().getName()print the name

例如,HashSet使用私有迭代器类HashMap.KeyIterator,它扩展了父类HashMap.HashIterator

iterator screenshot

答案 3 :(得分:0)

在您的情况下,Set keys对象是一个具体的实现,如

  

所有已知的实施类:   AbstractSet,ConcurrentSkipListSet,CopyOnWriteArraySet,EnumSet,HashSet,JobStateReasons,LinkedHashSet,TreeSet

他们实现了Iterable。

例如TreeSet imeplements Iterable

  

所有已实施的接口:   Serializable,Cloneable,Iterable,Collection,NavigableSet,Set,SortedSet

答案 4 :(得分:0)

接口无法实现方法,这是对的。

但是it 对对象的引用,特别是实现Iterator接口的对象。

如果接口说一个方法返回一个迭代器,那么创建该接口实现的任何人都有责任提供这些方法可以返回的Iterator实现。他们可能能够在其内部数据结构上重用现有的迭代器,或者他们可能需要创建一个新的迭代器。

答案 5 :(得分:0)

将接口视为“合同”。

当你编写一个程序而你说“它是一个迭代器”时,编译器(或解释器,无论如何)“理解”的是任何声明该接口所期望的方法的东西都将被接受。这为您的程序提供了灵活性,这也是面向对象语言的全部内容。

现在,当程序需要有效执行时,解释器将开始搜索所有内部依赖项,以找出实际执行该“契约”的代码片段。这是由JAVA动态解决的。

在这种情况下,JAVA会看到“它”是“键”的迭代器。然后它还会看到“keys”是另一个接口(Set)实际上是指一个具体的Set实现(可以实际执行的一段代码),它是selector.selectedKeys()。

但是如果“selector”是另一个接口,那么JAVA将继续搜索,直到找到可以实际执行代码的人,然后事情继续进行。 : - )

答案 6 :(得分:0)

在集合类的那些实现中,有一个实现Iterator接口的内部类。它是内部类,它实现了Iterator接口的所有方法。与ArrayList一样,在其实现中,有

private class Itr implements Iterator<E> {
        int cursor;       // index of next element to return
        int lastRet = -1; // index of last element returned; -1 if no such
        int expectedModCount = modCount;

        public boolean hasNext() {
            return cursor != size;
        }

        @SuppressWarnings("unchecked")
        public E next() {
            checkForComodification();
            int i = cursor;
            if (i >= size)
                throw new NoSuchElementException();
            Object[] elementData = ArrayList.this.elementData;
            if (i >= elementData.length)
                throw new ConcurrentModificationException();
            cursor = i + 1;
            return (E) elementData[lastRet = i];
        }

        ...
}

最好从jdk源代码中学习它。我希望这个答案可以帮到你。

答案 7 :(得分:0)

你应该这样接近它。

Set keys = selector.selectedKeys();

上面的语句应该像这样读,“我有一个引用键指向Set接口的一些实现。它指向的实现可以在selectedkeys()的返回类型中找到。实现可以是一个hashSet ,LinkedHashSet或任何其他实现Set的类。另外,如果你检查set接口,它会扩展集合,其中inturn扩展为iterable。所以从接口很明显,Set的任何实现都肯定会实现iterator()

Iterator it = keys.iterator();

这一行应该被理解为“调用引用键指向的实现类的迭代器方法”。因此,要获得Iterator的实现,您需要首先确定哪些键指向的实现。源代码包含这些问题的所有答案。尝试深入研究集合源代码,你会发现各种Set实现,你可以看到Iterator是如何实现的。

答案 8 :(得分:-1)

简而言之:Set<E> extends一个超级接口Iterable<E>,因此传递来自Iterable<E>的方法

对象keys因此可以访问这些方法。

Here是指向文档的链接。