Java 在Hashset中迭代是如何工作的?

Java 在Hashset中迭代是如何工作的?,java,Java,我刚刚偶然发现了关于java.util.HashSet的这条语句,它说“这个类不保证集合的迭代顺序;特别是,它不保证随着时间的推移顺序保持不变。”有人能解释这条语句吗? 语句来源:它基本上意味着散列集没有顺序。那么,您不应该依赖代码中的值顺序 如果您的集合包含值{2,1,3}(插入顺序),则没有任何东西可以保证对其进行迭代将返回{2,1,3}或{1,2,3},这基本上意味着哈希集没有顺序。那么,您不应该依赖代码中的值顺序 如果您的集合包含值{2,1,3}(插入顺序),则没有任何东西可以保证迭代它

我刚刚偶然发现了关于java.util.HashSet的这条语句,它说“这个类不保证集合的迭代顺序;特别是,它不保证随着时间的推移顺序保持不变。”有人能解释这条语句吗?
语句来源:

它基本上意味着
散列集没有顺序。那么,您不应该依赖代码中的值顺序


如果您的集合包含值
{2,1,3}
(插入顺序),则没有任何东西可以保证对其进行迭代将返回
{2,1,3}
{1,2,3}

,这基本上意味着
哈希集
没有顺序。那么,您不应该依赖代码中的值顺序


如果您的集合包含值
{2,1,3}
(插入顺序),则没有任何东西可以保证迭代它将返回
{2,1,3}
{1,2,3}

,因为
HashSet
没有顺序,迭代器可能会依次遍历每个bucket的内容。这意味着,如果添加更多的项目,以便重新平衡存储桶,那么订单可能会发生变化


例如,如果你有
1
2
3
,并且你进行迭代,你很可能会得到
1
3
2
。此外,如果您稍后添加
4
,则可以得到
4
2
3
1
或任何其他顺序。

因为
哈希集
没有顺序,迭代器可能依次遍历所有存储桶和每个存储桶的内容。这意味着,如果添加更多的项目,以便重新平衡存储桶,那么订单可能会发生变化


例如,如果你有
1
2
3
,并且你进行迭代,你很可能会得到
1
3
2
。另外,如果您以后添加
4
,则可以获得
4
2
3
1
或任何其他顺序。

哈希集
使用N个存储桶,并基于它们的哈希代码将元素存储在其中一个存储桶中,以加快搜索速度:搜索元素时,集合计算元素的散列以知道需要搜索哪个bucket,然后检查该bucket是否包含该元素。这使得搜索速度提高了N倍,因为集合不需要检查其他N-1个桶

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


现在,当我们迭代一个
HashSet
时,我们从第一个bucket开始,然后从第二个bucket开始,依此类推。您可以看到,仅使用bucket的
Set
s不能保证元素的顺序相同,因为bucket可以在迭代之间更改。

HashSet
使用N个bucket,并基于它们的hashcode将元素存储在其中一个bucket中,以加快搜索速度:搜索元素时,集合计算元素的散列以知道需要搜索哪个bucket,然后检查该bucket是否包含该元素。这使得搜索速度提高了N倍,因为集合不需要检查其他N-1个桶

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


现在,当我们迭代一个
HashSet
时,我们从第一个bucket开始,然后从第二个bucket开始,依此类推。您可以看到,只使用bucket的
Set
s不能保证元素的顺序相同,因为bucket可以在迭代之间更改。

如果您放置三个条目并对它们迭代两次,两次都会得到相同的顺序。@SashaSalauyou是的,这是真的。但这是一个特例。对
Hashset
的任何调用都可能更改顺序。因此,假设顺序永远都不能保证,所以每当添加一个元素时,就会重新计算散列值,从而改变集合权限的顺序?如果我不高兴,请纠正我wrong@SashaSalauyou:仅仅因为迭代顺序在一种特殊情况下没有改变,并不能保证顺序在所有情况下都是一致的。当时HashMap的重新调整顺序很容易改变。@akhil_mittal可能会,但不是每次都会发生,你怎么能相信阅读了这个答案的第一个版本。如果你放三个条目并重复两次,你两次都会得到相同的顺序。@SashaSalauyou是的,这是真的。但这是一个特例。对
Hashset
的任何调用都可能更改顺序。因此,假设顺序永远都不能保证,所以每当添加一个元素时,就会重新计算散列值,从而改变集合权限的顺序?如果我不高兴,请纠正我wrong@SashaSalauyou:仅仅因为迭代顺序在一种特殊情况下没有改变,并不能保证顺序在所有情况下都是一致的。当HashMap重新调整大小时,顺序可以很容易地改变。@akhil_mittal可能会这样,但不是每次都会这样,你怎么能相信阅读这个答案的第一个版本。@YassinHajaj Javadoc。这意味着当你对HashSet使用迭代器时,在这个HashSet中你有3个集合,那么在一个迭代中返回集合的顺序将是第一个,第二次,第三次,另一次可能是第二次,第三次,first@YassinHajajJavadoc。这意味着当你对HashSet使用迭代器时,在这个HashSet中你有3个集合,那么在一个迭代中,返回集合的顺序将是第一、第二、第三,另一次可能是第二、第三、第一,之前的顺序将保持不变。事实上你