HashSet上的迭代成本还取决于支持映射的容量?

时间:2012-08-22 09:15:40

标签: java algorithm hashmap hashtable time-complexity

来自HashSet的JavaDocs:

  

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

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

4 个答案:

答案 0 :(得分:13)

使用HashSet创建

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

答案 1 :(得分:3)

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

答案 2 :(得分:0)

  

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

元素分散在由数组支持的基础HashMap内 因此,不知道哪些桶被占用(但已知有多少元素是完全可用的)  因此,要迭代所有元素 所有 存储桶必须进行检查

答案 3 :(得分:0)

如果您关注的是迭代该集合所花费的时间,并且您正在使用Java 6或更高版本,请看看这个美丽:

ConcurrentSkipListSet