[英]HashSet iteration
我有一个关于Java中HashSet迭代器的查询。 在“ Java泛型和集合”一书中指出:
集的哈希表实现的主要吸引力在于添加,删除,包含和大小的基本操作的(理想)恒定时间性能。 它的主要缺点是迭代性能。 由于遍历表涉及检查每个存储桶,因此其成本与表的大小成正比,而与它包含的集合的大小无关。
它指出迭代器在基础表的每个存储桶中查找。 但是通过实际实现(JDK 8),我看到HashIterator存储了下一个节点引用。 因此,似乎迭代器不需要访问每个存储桶。
这里的书错了还是我的理解错了?
该文件是正确的。 虽然KeyIterator
确实会调用nextNode().key
,像这样
final class KeyIterator extends HashIterator implements Iterator<K> {
public final K More ...next() {
return nextNode().key;
}
}
基类HashIterator
nextNode()
的代码具有文档所讨论的循环:
final Node<K,V> nextNode() {
Node<K,V>[] t;
Node<K,V> e = next;
if (modCount != expectedModCount)
throw new ConcurrentModificationException();
if (e == null)
throw new NoSuchElementException();
if ((next = (current = e).next) == null && (t = table) != null) {
do {} while (index < t.length && (next = t[index++]) == null);
}
return e;
}
空主体的do
/ while
循环逐个遍历各个存储桶,以查找下一个条目。
唯一可能与此相关的时间是当您遍历散列集时,该散列集已预先分配有大量存储桶,但尚未填充大量项目。 当您添加更多项目时让HashSet
自身增长时,存储桶的数量将与您到目前为止插入的项目数量成正比,因此速度下降不会很明显。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.