来自HashSet的JavaDocs:
此类为基本操作提供恒定的时间性能 (添加,删除,包含和大小),假设散列函数分散 桶中的元素正确。迭代这个集合 需要的时间与HashSet实例的大小之和成正比 (元素数量)加上后备HashMap的“容量” 实例(桶的数量)。因此,不设置是非常重要的 如果,初始容量太高(或负载因子太低) 迭代性能很重要
为什么迭代需要的时间与总和(集合中的元素数量+支持映射的容量)成比例,而不仅仅是集合本身中元素的数量?
答案 0 :(得分:13)
HashSet
创建 HashMap
,其中元素是地图键。由于映射具有可定义数量的桶,可以包含一个或多个元素,因此迭代需要检查每个桶,无论它是否包含元素。
答案 1 :(得分:3)
使用LinkedHashSet遵循“链接”条目列表,因此空白数量无关紧要。通常你不会有HashSet,其容量远远超过实际使用大小的两倍。即使你这样做,扫描一百万个条目,大多数null
也不会花费太多时间(毫秒)
答案 2 :(得分:0)
为什么迭代需要时间与总和成正比(数量为 集合中的元素+支持映射的容量)而不仅仅是数字 集合中的元素?
元素分散在由数组支持的基础HashMap
内
因此,不知道哪些桶被占用(但已知有多少元素是完全可用的)
因此,要迭代所有元素 所有 存储桶必须进行检查
答案 3 :(得分:0)
如果您关注的是迭代该集合所花费的时间,并且您正在使用Java 6或更高版本,请看看这个美丽: