迭代如何在Hashset中工作?

时间:2015-10-16 16:12:30

标签: java

我只是偶然发现了关于 java.util.HashSet 的声明,并且它是“此类不保证集合的迭代顺序;特别是,它没有保证订单会随着时间的推移保持不变。“任何人都可以解释声明吗? 声明来源: click here

3 个答案:

答案 0 :(得分:4)

HashSet正在使用 N 存储桶并将基于其哈希码的元素存储在其中一个存储桶中,以便更快地进行搜索:当您搜索元素时,该集合将计算哈希值要知道它需要搜索哪个存储桶的元素,然后检查该存储桶是否包含此元素。这样可以更快地搜索 N ,因为该集合不需要检查其他 N-1 存储桶。

对于少量元素,桶的数量可以很小。但随着更多元素的到来,存储桶将开始包含更多元素,这意味着搜索速度会变慢。要解决此问题,该集需要添加更多存储桶并重新排列其元素以使用新存储桶。

现在,当我们迭代HashSet时,我们先从第一个桶中的元素开始,然后从第二个桶开始,依此类推。您会看到仅使用存储桶的Set无法保证元素的顺序相同,因为存储桶可以在迭代之间进行更改。

答案 1 :(得分:3)

这基本上意味着HashSet没有订单。那么你不应该依赖代码中的值顺序。

如果您的集合包含值{2, 1, 3}(插入顺序),则无需保证迭代它将返回{2, 1, 3}{1, 2, 3}

答案 2 :(得分:3)

由于HashSet未被排序,因此迭代器可能会遍历所有存储桶并依次遍历每个存储桶的内容。这意味着如果添加更多项目以便重新平衡存储桶,则订单可以更改。

E.g。如果您有123,并且您进行了迭代,则可能会132。此外,如果您稍后添加4,则可以获得4231或任何其他订单。

相关问题