Java 哈希集上的迭代成本也取决于备份映射的容量?

Java 哈希集上的迭代成本也取决于备份映射的容量?,java,algorithm,hashmap,hashtable,time-complexity,Java,Algorithm,Hashmap,Hashtable,Time Complexity,从以下的JavaDocs: 此类为基本操作提供恒定时间性能 (添加、删除、包含和大小),假设散列函数分散 将这些元件正确地安装在铲斗之间。在这个集合上迭代 需要与哈希集实例大小之和成比例的时间 (元素的数量)加上支持HashMap的“容量” 实例(存储桶的数量)。因此,不要设置 初始容量过高(或负载系数过低),如果 迭代性能很重要 为什么迭代所花费的时间与总和(集合中的元素数量+后备映射的容量)成比例,而不仅仅与集合本身中的元素数量成比例 .HashSet使用HashMap实现,其中元素是映射键

从以下的JavaDocs:

此类为基本操作提供恒定时间性能 (添加、删除、包含和大小),假设散列函数分散 将这些元件正确地安装在铲斗之间。在这个集合上迭代 需要与哈希集实例大小之和成比例的时间 (元素的数量)加上支持HashMap的“容量” 实例(存储桶的数量)。因此,不要设置 初始容量过高(或负载系数过低),如果 迭代性能很重要

为什么迭代所花费的时间与总和(集合中的元素数量+后备映射的容量)成比例,而不仅仅与集合本身中的元素数量成比例


.

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

使用LinkedHashSet遵循“链接”条目列表,因此空格的数量无关紧要。通常情况下,如果哈希集的容量是实际使用大小的两倍以上,则不会有哈希集。即使你这样做了,扫描一百万个条目,大部分是
null
也不会花费太多时间(毫秒)

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

元素分散在由数组支持的基础
HashMap
中。
因此,不知道哪些存储桶被占用(但知道有多少元素完全可用)。

因此,要迭代所有元素,必须检查所有bucket

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


在不遍历所有空桶的情况下,您如何遍历所有元素?相关:您还可以向下搜索以查看引擎盖下发生的情况。在我的机器上,每100万个空值对应2毫秒;-)@亚西莉亚听起来是对的。无论您做什么,在哈希集上迭代都不会有什么好处。你真的想做一些查找或排序收集,如果你想提高速度,你只需要处理几个条目。hashmap的值是什么?@Geek,因为这些值并不重要,它们只是虚拟对象(或者更准确地说,它是一个虚拟对象:
私有静态最终对象PRESENT=new object();
)。