来自HashSet的 JavaDocs :
此类为基本操作(添加、删除、包含和大小)提供恒定的时间性能,假设哈希函数将元素正确地分散在桶中。迭代这个集合需要的时间与 HashSet 实例的大小(元素的数量)加上支持 HashMap 实例的“容量”(桶的数量)的总和成正比。因此,如果迭代性能很重要,则不要将初始容量设置得太高(或负载因子太低),这一点非常重要
为什么迭代花费的时间与总和(集合中的元素数量+支持映射的容量)成正比,而不仅仅是集合本身的元素数量?
.
HashSet
使用 a 来实现HashMap
,其中元素是映射键。由于地图具有定义数量的可包含一个或多个元素的桶,因此迭代需要检查每个桶,无论它是否包含元素。
使用 LinkedHashSet 遵循“链接”条目列表,因此空格的数量无关紧要。通常你不会有一个容量比实际使用的大小多一倍的 HashSet。即使您这样做,扫描一百万个条目null
也不会花费太多时间(毫秒)
为什么迭代花费的时间与总和(集合中的元素数量+支持映射的容量)成正比,而不仅仅是集合本身的元素数量?
元素分散在HashMap
由数组支持的底层内部。
所以不知道哪些桶被占用(但知道有多少元素是完全可用的)。
因此,要遍历所有元素,必须检查所有桶
如果您关心的是迭代集合所花费的时间,并且您使用的是 Java 6 或更高版本,请查看以下优点: