1

我们都知道 unsorted Sets 不保证顺序,并且它们可以变异和改变。

我的问题是,这种情况多久发生一次,是什么原因造成的?

如果我偶尔从 Set 中抓取第一个元素,它会是可靠的伪随机吗?

4

3 回答 3

1

例如,在 HashSet 中添加新元素可以重新排序之前添加的所有元素。当你达到容量时它可能会发生(看看这个地方在java源代码:http: //grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/util/ HashMap.java#772 )

在 TreeSet 中,您可能希望使用 compareTo 添加新元素,将此元素放在集合的中间并更改顺序。

于 2015-10-17T04:07:12.320 回答
1

要记住的最重要的事情是,这Set不是 Java 中的实现。这只是一个界面。并且在其文档中唯一提到订购它只是表示它不做任何保证。

返回的元素没有特定的顺序(除非这个集合是某个提供保证的类的实例)。

这意味着您不能假设 a 的顺序Set,除非您知道实现是什么。实现者可以自由地做任何事情,从保持排序到运行后台线程,每隔几秒随机化一次顺序。

如果您查看各种Sets 的 Javadocs,您会发现保证各不相同,来自LinkedHashSet

[迭代顺序] 是元素插入集合的顺序

树集

元素使用其自然顺序进行排序

哈希集

不保证集合的迭代顺序

在这些描述的范围内,Sets 可以自由地按自己的意愿排序。这意味着定义明确的那些只需要在某些事情(例如插入或移除)导致他们需要新的订单来履行他们的合同时重新排序。没有保证的那些不承诺任何东西,但可能具有某种形式的内部结构,允许快速查找,这将 a) 可能保持相当稳定,并且 b) 很可能优先考虑某些项目而不是其他项目。他们也可能不会,但你不能做出任何假设。

于 2015-10-17T04:07:29.870 回答
1

我的问题是,这种情况多久发生一次,是什么原因造成的?

每当应用程序调用变异操作时,就会发生变异;例如添加、删除等。它不会自发发生。

(多久一次?正如你所说的变异方法......当然。)

如果我偶尔从 Set 中抓取第一个元素,它会是可靠的伪随机吗?

不,它很可能是“随机性”的不良来源。

虽然这取决于Set您使用的类,但突变到 aSet通常不会显着改变元素的迭代顺序......或者在许多情况下,根本不会。在绝大多数情况下,对集合的“随机”小突变不会改变作为第一个元素返回的内容。

于 2015-10-17T04:07:41.967 回答