Java Collections hasnext()方法

时间:2013-10-16 11:13:47

标签: java

Set set = new HashSet();

set.add(1);
set.add(2)

Iterator iter = set.iterator();  // Wher hasnext been overrided
while(iter.hasnext()){

System.out.println(iter.next);
}

Iterator是一个接口,set.iterator返回Iterator引用。 在HashSet(及其扩展的,实现的类)中,hasnext无处覆盖。 我怀疑的是hasnext方法被覆盖(实现)以及它在此上下文中的链接方式。

感谢。

4 个答案:

答案 0 :(得分:7)

HashSet返回Iterator的实现,但它本身并未实现Iterator。如果您查看HashSet的源代码,可以看到它实际上由HashMap支持:

public HashSet() {
map = new HashMap<E,Object>();
}

当你调用iterator()方法时,它是这个地图的迭代器:

public Iterator<E> iterator() {
return map.keySet().iterator();
}

此地图反过来存储一个KeySet ...

private final class KeySet extends AbstractSet<K> {
    public Iterator<K> iterator() {
        return newKeyIterator();
    }
    public int size() {
        return size;
    }
    public boolean contains(Object o) {
        return containsKey(o);
    }
    public boolean remove(Object o) {
        return HashMap.this.removeEntryForKey(o) != null;
    }
    public void clear() {
        HashMap.this.clear();
    }
}

当调用iterator()方法时,它会返回KeyIterator:

private final class KeyIterator extends HashIterator<K> {
    public K next() {
        return nextEntry().getKey();
    }
}

HashIterator实施Iterator

private abstract class HashIterator<E> implements Iterator<E>

最终,Iterator的实现是HashIterator的私有子类,它隐藏为客户端隐藏的实现细节。这就是使用界面的美妙!

答案 1 :(得分:1)

你可以在HashSet的源代码中看到iterator()方法是这样实现的:

 public Iterator<E> iterator() {
    return map.keySet().iterator();
    }

在AbstractHashedSet类中,实现了键集的迭代器

/**
     * KeySet iterator.
     */
    protected static class KeySetIterator extends EntrySetIterator {

        protected KeySetIterator(AbstractHashedMap parent) {
            super(parent);
        }

        public Object next() {
            return super.nextEntry().getKey();
        }
    }

所以你确实有一个实现。 如果你的代码中遇到hasNext()方法的问题,我想你应该重新说出你的问题。

答案 2 :(得分:0)

HashSet实现使用HashMap,因此HashSet的迭代器是其keySet的{​​{1}}的迭代器... {{1}迭代器的实现在HashMap类中,如下所示:AbstractMap-keySet

答案 3 :(得分:0)

在第

Iterator iter = set.iterator();

您正在调用Set上的方法,该方法返回实现Iterator接口的类的实例。确切地说返回哪个类并不重要,您需要关心的是它实现了Iterator,因此实现了hasNext()方法。

实际的类可能不是API的一部分,可能会随着JVM的不同版本而改变。您唯一可以确定的是它将实现Iterator。