
hash的容量问题
哈希表的容量一定要是2的整数次幂,这样HashMap中则通过h&(length-1)的方法来代替取模,就实现了均匀的散列。同时在数组进行扩容时,扩容前的元素的下标位置是不变的,避免了数组元素的重排。但是,我们仍然要避免数组的扩容,因为它依然很大的降低的了map的put性能,这也是HashMap定义加载因子的原因所在。
HashMap的实现原理
HashMap的底层主要是基于数组和链表来实现的,它之所以有相当快的查询速度主要是因为它是通过计算散列码来决定存储的位置。HashMap预定义了一个很长的数组,每个数组元素相当于一个取放存取对象的桶。
为了在时间和空间上都能找到一个比较令人满意的处理方式,通过散列码来查询函数下标。这又带来一个问题,不同的对象的散列码可能值是一样
默认加载因子
冲突的机会越大,则查找的成本越高.因此,必须在 "冲突的机会"与"空间利用率"之间寻找一种平衡与折衷. 这种平衡与折衷本质上是数据结构中有名的"时-空"矛盾的平衡与折衷。如果机器内存足够,并且想要提高查询速度的话可以将加载因子设置小一点;相反如果机器内存紧张,并且对查询速度没有什么要求的话可以将加载因子设置大一点。不过一般我们都不用去设置它,让它取默认值0.75就好了。
本文详细探讨了哈希表的容量选择,为何需要为2的整数次幂,以及HashMap如何通过h&(length-1)避免取模操作。此外,解释了HashMap的扩容策略,指出扩容可能导致元素重排,影响性能。默认加载因子0.75在空间利用率和查询速度之间取得平衡。内容还涉及HashMap的实现原理,包括基于数组和链表的数据结构,以及散列码在解决冲突中的作用。
1915

被折叠的 条评论
为什么被折叠?



