我们都知道 unsorted Sets 不保证顺序,并且它们可以变异和改变。
我的问题是,这种情况多久发生一次,是什么原因造成的?
如果我偶尔从 Set 中抓取第一个元素,它会是可靠的伪随机吗?
例如,在 HashSet 中添加新元素可以重新排序之前添加的所有元素。当你达到容量时它可能会发生(看看这个地方在java源代码:http: //grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/util/ HashMap.java#772 )
在 TreeSet 中,您可能希望使用 compareTo 添加新元素,将此元素放在集合的中间并更改顺序。
要记住的最重要的事情是,这Set
不是 Java 中的实现。这只是一个界面。并且在其文档中唯一提到订购它只是表示它不做任何保证。
返回的元素没有特定的顺序(除非这个集合是某个提供保证的类的实例)。
这意味着您不能假设 a 的顺序Set
,除非您知道实现是什么。实现者可以自由地做任何事情,从保持排序到运行后台线程,每隔几秒随机化一次顺序。
如果您查看各种Set
s 的 Javadocs,您会发现保证各不相同,来自LinkedHashSet
[迭代顺序] 是元素插入集合的顺序
到树集
元素使用其自然顺序进行排序
到哈希集
不保证集合的迭代顺序
在这些描述的范围内,Sets 可以自由地按自己的意愿排序。这意味着定义明确的那些只需要在某些事情(例如插入或移除)导致他们需要新的订单来履行他们的合同时重新排序。没有保证的那些不承诺任何东西,但可能具有某种形式的内部结构,允许快速查找,这将 a) 可能保持相当稳定,并且 b) 很可能优先考虑某些项目而不是其他项目。他们也可能不会,但你不能做出任何假设。
我的问题是,这种情况多久发生一次,是什么原因造成的?
每当应用程序调用变异操作时,就会发生变异;例如添加、删除等。它不会自发发生。
(多久一次?正如你所说的变异方法......当然。)
如果我偶尔从 Set 中抓取第一个元素,它会是可靠的伪随机吗?
不,它很可能是“随机性”的不良来源。
虽然这取决于Set
您使用的类,但突变到 aSet
通常不会显着改变元素的迭代顺序......或者在许多情况下,根本不会。在绝大多数情况下,对集合的“随机”小突变不会改变作为第一个元素返回的内容。