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方法被覆盖(实现)以及它在此上下文中的链接方式。
感谢。
答案 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。