Java HashSet中需要填充比率或负载因子概念吗

Java HashSet中需要填充比率或负载因子概念吗,java,hashset,Java,Hashset,正如我所研究的HashSet类一样,它使用了填充比率的概念,即如果HashSet填充到这个限制,则创建一个更大的HashSet并将值复制到其中。为什么我们不让HashSet充满object,然后创建一个新的HashSet呢?为什么要为HashSet派生一个新概念 ArrayList和Vector都是通过位置索引访问的,因此没有冲突,访问总是O(1) 基于散列的数据结构由散列值访问,散列值可能冲突并降级为对第二级“溢出”数据结构(列表或树)的访问。如果没有此类冲突,则访问权限为O(1),但如果有许

正如我所研究的HashSet类一样,它使用了填充比率的概念,即如果HashSet填充到这个限制,则创建一个更大的HashSet并将值复制到其中。为什么我们不让HashSet充满object,然后创建一个新的HashSet呢?为什么要为HashSet派生一个新概念

ArrayList和Vector都是通过位置索引访问的,因此没有冲突,访问总是O(1)

基于散列的数据结构由散列值访问,散列值可能冲突并降级为对第二级“溢出”数据结构(列表或树)的访问。如果没有此类冲突,则访问权限为O(1),但如果有许多冲突,则情况可能会更糟。您可以通过分配更多内存来控制这一点(这样就有更多的存储桶,希望冲突更少)


因此,无需将ArrayList扩展到存储所有元素所需的容量,但对于HashSet来说,“浪费”一点(或很多)是有意义的。该参数被公开,以允许程序员选择最适合其应用程序的参数。

正如Jonny Henly所描述的那样。这是因为数据的存储方式


ArrayList是线性数据结构,而HashSet不是。在HashSet中,数据基于hashcode存储在底层数组中。在某种程度上,HashSet的性能与填充了多少个存储桶以及数据在这些存储桶中的分布情况有关。一旦数据的分布超出某个级别(称为加载因子),就要进行重新散列。

散列集主要用于确保在恒定时间内执行基本操作(如添加、获取、修改和删除),而不考虑散列集中存储的条目的数量

虽然设计良好的散列函数可以实现这一点,但设计一个散列函数可能需要时间。因此,如果性能是应用程序的关键要求,那么我们可以使用负载因子来确保操作也在恒定时间内执行。我认为我们可以将这两个函数都称为彼此的冗余(负载因子和散列函数)


我同意这可能不是一个完美的解释,但我希望它确实能使主题更加清晰。

这有帮助吗?
ArrayList
是否可以包含重复项?
ArrayList
是否以任何方式使用哈希代码?这不是一个新的概念——考虑<代码> HashMap <代码>help@JonnyHenly我只是问为什么要有这个概念。应该有一些需求,对吧?嗯
ArrayLists
的增长就像您(有些错误地)描述了
HashSet
的增长一样。当一个
HashSet
增长时,它会将其存储桶的数量增加2倍,然后将其条目重新存储到存储桶中。当
ArrayList
增长时,它将以
1.5倍于旧数组的大小创建一个新的基础数组,然后将旧数组中的条目复制到新数组中。