首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >HashSet迭代

HashSet迭代
EN

Stack Overflow用户
提问于 2015-08-16 13:41:35
回答 1查看 560关注 0票数 2

我有一个关于Java中HashSet迭代器的查询。在"Java泛型和集合“一书中,说明如下:

对于集的哈希表实现的主要吸引力是(理想情况下)基本操作添加、删除、包含和大小的恒定时间性能。它的主要缺点是它的迭代性能;因为迭代遍历表需要检查每个桶,因此它的成本与表的大小成正比,而不管它包含的集合大小如何。

它指出迭代器在底层表的每个桶中查找。但是通过实际实现(JDK 8),我看到HashIterator存储下一个节点引用。因此,迭代器似乎不需要访问每个桶。

这里的书是错的还是我的理解错了?

EN

回答 1

Stack Overflow用户

发布于 2015-08-16 13:54:31

文件是对的。虽然KeyIterator确实调用了nextNode().key,但如下所示

代码语言:javascript
复制
final class KeyIterator extends HashIterator implements Iterator<K> {
    public final K More ...next() {
        return nextNode().key;
    }
}

基类nextNode()中的HashIterator代码具有文档正在讨论的循环:

代码语言:javascript
复制
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自行增长时,存储桶的数量将与插入到目前为止的项目数量成正比,因此减速不会显着。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32035709

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档