12

来自HashSet的 JavaDocs :

此类为基本操作(添加、删除、包含和大小)提供恒定的时间性能,假设哈希函数将元素正确地分散在桶中。迭代这个集合需要的时间与 HashSet 实例的大小(元素的数量)加上支持 HashMap 实例的“容量”(桶的数量)的总和成正比。因此,如果迭代性能很重要,则不要将初始容量设置得太高(或负载因子太低),这一点非常重要

为什么迭代花费的时间与总和(集合中的元素数量+支持映射的容量)成正比,而不仅仅是集合本身的元素数量?

.

4

4 回答 4

15

HashSet使用 a 来实现HashMap,其中元素是映射键。由于地图具有定义数量的可包含一个或多个元素的桶,因此迭代需要检查每个桶,无论它是否包含元素。

于 2012-08-22T09:20:17.240 回答
3

使用 LinkedHashSet 遵循“链接”条目列表,因此空格的数量无关紧要。通常你不会有一个容量比实际使用的大小多一倍的 HashSet。即使您这样做,扫描一百万个条目null也不会花费太多时间(毫秒)

于 2012-08-22T09:22:30.007 回答
0

为什么迭代花费的时间与总和(集合中的元素数量+支持映射的容量)成正比,而不仅仅是集合本身的元素数量?

元素分散在HashMap由数组支持的底层内部。
所以不知道哪些桶被占用(但知道有多少元素是完全可用的)。
因此,要遍历所有元素,必须检查所有

于 2012-08-22T09:25:45.710 回答
0

如果您关心的是迭代集合所花费的时间,并且您使用的是 Java 6 或更高版本,请查看以下优点:

并发跳过列表集

于 2012-08-22T09:59:07.880 回答