我只是偶然发现了关于 java.util.HashSet 的声明,并且它是“此类不保证集合的迭代顺序;特别是,它没有保证订单会随着时间的推移保持不变。“任何人都可以解释声明吗? 声明来源: click here
答案 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。如果您有1
,2
,3
,并且您进行了迭代,则可能会1
,3
,2
。此外,如果您稍后添加4
,则可以获得4
,2
,3
,1
或任何其他订单。