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是一个接口(interface),set.iterator返回Iterator引用。 在 HashSet(及其扩展的实现类)中,next 没有被覆盖。 我的疑问是 hasext 方法在哪里被重写(实现)以及它在这种情况下如何链接。
谢谢。
最佳答案
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
的私有(private)子类,它作为对客户端隐藏的实现细节而隐藏起来。这就是使用界面的美妙之处!
关于Java 集合 hasext() 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19401928/