HashSet返回Iterator的实现,它本身不实现Iterator。如果查看HashSet的源代码,可以看到它实际上是由HashMap支持的:
public HashSet() {
map = new HashMap();
}当您调用iterator()方法时,它将返回此映射的迭代器:
public Iterator iterator() {
return map.keySet().iterator();
}这个地图反过来存储一个KeySet ......
private final class KeySet extends AbstractSet {
public Iterator 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 {
public K next() {
return nextEntry().getKey();
}
}并且HashIterator实现了Iterator:
private abstract class HashIterator implements Iterator因此,最终,Iterator的实现是HashIterator的私有子类,它隐藏为客户端隐藏的实现细节。这就是使用界面的美妙!