HashMap的优化

HashMap结构的优化

HashMap的复杂度

 查找/获取添加/删除空间
ArrayListO(1)O(N)O(N)
LinkedListO(N)O(1)O(N)
HashMapO(N/Buckets)O(N/Buckets)O(N)

ArrayList 和 LinkedList 可以看作是HashMap的两个极端。

若HashMap的所有元素都不发生哈希冲突,就变成了数组存储的ArrayList。

若所有元素都在同一个桶内发生哈希冲突,就变成了链表存储的LinkedList。在JDK1.8之后,当HashMap中的链表长度达到8时,会将链表转为红黑树结构,复杂度就变成了O(logN/Buckets)

由链表到红黑树,是JDK8对HashMap的优化,当链表中元素过多时,红黑树可以优化查询速率。

哈希算法的优化

哈希算法决定了key计算出的哈希值,而计算出的哈希值越分散,计算哈希桶时就越不容易发生碰撞。

在哈希桶数组大小固定的情况下,好的哈希算法能更大程度上避免碰撞。

对HashMap的容量进行优化

如果哈希桶数组很大,即使较差的Hash算法也会比较分散,如果哈希桶数组数组很小,即使好的Hash算法也会出现较多碰撞,所以就需要在空间成本和时间成本之间权衡,其实就是在根据实际情况确定哈希桶数组的大小,并在此基础上设计好的hash算法减少Hash碰撞。

解决扩容损失

如果知道HashMap大致需要的容量,可以在初始化时设置初始容量,避免频繁扩容带来的性能损失

比如我现在有1000个数据,需要 1000/0.75 = 1333 ,又 1024 < 1333 < 2048,所以最好使用2048作为初始容量。

 

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 深蓝海洋 设计师:CSDN官方博客 返回首页