0
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(及其扩展的、已实现的类)中,hasext 无处被覆盖。我的疑问是 hasext 方法在哪里被覆盖(实现)以及它在这种情况下如何链接。

谢谢。

4

4 回答 4

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它作为对客户端隐藏的实现细节被隐藏起来。这就是使用接口的美妙之处!

于 2013-10-16T11:17:21.220 回答
1

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

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

在类 AbstractHashedSet 中实现了 keyset 的迭代器

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

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

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

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

于 2013-10-16T11:18:54.887 回答
0

HashSet实现使用 aHashMap所以迭代器是它HashSet的迭代器......迭代器的实现在类中,如下所示:AbstractMap-keySetkeySetHashMapkeySetAbstractMap

于 2013-10-16T11:23:26.980 回答
0

在行

Iterator iter = set.iterator();

您正在调用 Set 上的方法,该方法返回实现 Iterator 接口的类的实例。究竟返回什么类并不重要,您需要关心的是它实现了 Iterator,因此实现了 hasNext() 方法。

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

于 2013-10-16T11:25:00.830 回答