HashMap原理

65 阅读1分钟

hashMap 1.7版本是一个由对象数组+链表 实现的数据结构 1.8 就是数组+链表/红黑树

他的核心实现原理在put方法上 put方法的逻辑大概是这样子的 a 通过key值 hash算法计算获取 hash值 b hash值与上tab 长度-1 得到下标 c 如果节点不存在没有发生碰撞就保存数组中 d 如果碰撞了就判断链表长度是否超过8 超过就变成红黑树 没有就添加到链表的尾部 f 如果节点存在就覆盖之前的值 g 如果数组超过 扩容因子0.75*数组长度 就需要扩容

衍生的问题

1、为什么使用数组+链表结构

因为存在hash碰撞问题 导致增加了链表结构

2、为什么扩容需要是2 n幂运算

扩容后减少元素的移动 使元素均匀的分布在数组中 减少hash碰撞 如果扩容不为2的倍数比如为10的话会产生大量的hash碰撞

3、key跟value是可以为null吗

可以的 但是key只能存在一个为null的 value可以多个为null

参考 HashMap原理详解,看不懂算我输(附面试题) - 知乎 (zhihu.com)