【发布时间】:2019-04-15 13:03:46
【问题描述】:
我发现一个(对我来说)在 Java 中实现的 HashSet 的莫名其妙的行为。我像这样实现了 HashSet 并用列表的值填充它。
HashSet<Integer> set = new HashSet<Integer>(list);
我首先使用了一个包含从 0 到 9 的数字的列表来填充 HashSet:
示例:{1,0,5,9,6,7,3,1,3,6,1,5,1,3,4,9,9,7}
输出:[0, 1, 3, 4, 5, 6, 7, 9]
由于 HashSet 通常按升序返回值,直到现在一切正常。但是,一旦我开始使用包含更大值的列表,它就会开始以一种奇怪的方式返回值:
示例:{67,1,122,19,456,42,144,42,3,34,5,5,42}
输出:[1, 34, 67, 3, 5, 456, 42, 144, 19, 122]
我在这里读到了一些关于这取决于内部散列算法的信息:Java HashSet shows list in weird order, always starting with 3,但这更加令人困惑,因为我使用了完全相同的 HashSet,只是具有不同的值。
谁能解释一下为什么会这样?
【问题讨论】:
-
你为什么担心订单? JavaDoc 说明如下: 它不保证集合的迭代顺序;特别是,它不保证订单会随着时间的推移保持不变。
-
永远不要依赖
HashSet的迭代顺序! -
@Logan 因为我用它几次来订购整数数组,它适用于较小的值,所以我有点困惑为什么它停止适用于较大的值。不,它不是另一个问题的重复。
-
@Logan 是的,这个回答了。我只是没有找到这个问题。