由于我已经研究过HashSet类,它使用填充率的概念,它表示如果HashSet填充到此限制,则创建更大的HashSet并将值复制到其中。为什么我们不让HashSet充满对象然后创建一个新的HashSet?为什么为HashSet派生新概念?
答案 0 :(得分:5)
ArrayList和Vector都是通过位置索引访问的,因此没有冲突,访问总是O(1)。
基于散列的数据结构由散列值访问,散列值可能会发生碰撞并降级为对第二级“溢出”数据结构(列表或树)的访问。如果你没有这样的碰撞,访问是O(1),但如果你有很多碰撞,它可能会更糟。您可以通过分配更多内存来控制这一点(以便有更多的存储桶,希望更少的冲突)。
因此,不需要将ArrayList增加到比存储所有元素所需的容量更多的容量,但是在HashSet的情况下“浪费”一点(或很多)是有意义的。公开该参数以允许程序员选择最适合其应用程序的参数。
答案 1 :(得分:0)
正如Jonny Henly所描述的那样。这是因为数据的存储方式。
ArrayList是线性数据结构,而HashSet则不是。在HashSet中,数据基于哈希码存储在底层数组中。在某种程度上,HashSet的性能与填充了多少桶以及在这些桶之间分配数据的能力有关。一旦这种数据分布超出一定水平(称为负载系数),就会重新散列。
答案 2 :(得分:0)
HashSet主要用于确保基本操作(如添加,获取,修改和删除)在恒定时间内执行,而不管存储在HashSet中的条目数。
虽然设计良好的哈希函数可以实现这一点,但设计一个可能需要时间。因此,如果性能是应用程序的关键要求,我们可以使用负载因子来确保操作也在恒定时间内执行。我认为我们可以将这两者称为彼此的冗余(加载因子和哈希函数)。
我同意这可能不是一个完美的解释,但我希望它确实能够澄清这个问题。