HashMap的底层原理

1.HashMap是

       根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。

2.什么是哈希冲突(面试题)

        存储数据时,对key值进行hash运算,找到对应的下标位置进行存储,该位置没有数据就直接存储,当该位置有数据时就会出现hash冲突和碰撞。

3.解决哈希冲突的方法(面试题)
(1) 开放地址法

插入一个元素的时候,先通过哈希函数进行判断,若是发生哈希冲突,就以当前地址为基准,根据再寻址的方法(探查序列),去寻找下一个地址,若发生冲突再去寻找,直至找到一个为空的地址为止。所以这种方法又称为再散列法。

(2) 再哈希法

再哈希法又叫双哈希法,有多个不同的Hash函数,当发生冲突时,使用第二个,第三个,….,等哈希函数计算地址,直到无冲突。虽然不易发生聚集,但是增加了计算时间。

(3) 链地址法

每个哈希表节点都有一个next指针,多个哈希表节点可以用next指针构成一个单向链表,被分配到同一个索引上的多个节点可以用这个单向链表连接起来。

比如 66和88这两个元素哈希值都是1,这就发生了哈希冲突,采用链地址法,可以把 66和88放在同一个链表中。

(4)建立公共溢出区

将哈希表分为基本表和溢出表两部分,凡是和基本表发生冲突的元素,一律填入溢出表。

4.HashMap和HashTable的区别

①线程是否安全

HashMap线程不安全。HashTable线程安全,但是效率较低。

②是否null

HashMap中key只能有一个null,value可以多个为null。HashTable不允许键或值为null。

③容量

HashMap底层数组长度必须为2的幂(16,32,128…),默认为16。HashTable底层数组长度可以为任意值,导致hash算法散射不均匀,容易造成hash冲突,默认为11。

④底层区别

HashMap是底层由数组+链表形成,在JDK1.8之后链表长度大于8时转化为红黑树。HashTable一直都是数组+链表。

⑤继承关系

HashTable继承自Dictionary(滴克迅那瑞)类。

HashMap继承自AbstractMap(啊不斯拽t Map)类。

5.HashMap链表和红黑树转换(面试题)
  • 链表长度大于8,并且表的长度大于64   数组 + 红黑树
  • 链表长度大于8,并且表的长度不大于64  数组 + 链表 会扩容
  • 当数的节点小于6             数组 + 链表
6.为什么负载因子是0.75?

根据时间复杂度和空间复杂度计算,表长度达到8个元素的时候,概率为0.00000006,几乎是一个不可能事件,减少了哈希冲突。

加载因子 = 填入表中的元素个数 / 散列表的长度

7.HashMap扩容(面试题)
(1)什么时候会发生扩容?

元素个数 > 数组长度 * 负载因子 例如 16 * 0.75 = 12,当元素超过12个时就会扩容。

链表长度大于8并且表长小于64,也会扩容

(2)为什么不是满了扩容?

因为越元素越接近数组长度,哈希冲突概率就越大,所以不是满了扩容。

  • 5
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值