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