小老弟,谈谈hashmap!!!
关于hashMap,一堆博客,废话者居多,因此,想用自己的话总结一篇。简明扼要,让小老弟们看懂,更是自我总结。
谈论这个问题,需要用jdk1.7和jdk1.8对比来看,来说,不然面试官会觉得你是个low货,他本身期待你自己说的时候,对比来说。具体从这几个方面对比来说:结构,原理,插入键值对的put方法的区别,扩容策略, 扩容检查顺序, 流程图。
结构:
1.7版本:数组+单向链表(HashMap底层就是一个数组,数组中的每一项又是一个单向链表)
1.8版本:数组+hash表+红黑树
底层原理(这里不区分版本,回答下面这段即可):
我们通过put()和get()方法储存和获取对象。当我们将键值对传递给put()方法时,它调用键对象的hashCode()方法来计算hashcode,让后找到bucket位置来储存值对象。当获取对象时,通过键对象的equals()方法 找到正确的键值对,然后返回值对象。HashMap使用链表来解决碰撞问题,当发生碰撞了,对象将会储存在链表的下一个节点中。 HashMap在每个链表节点中储存键值对对象。
插入键值对的put方法的区别:
1.7版本:1.7中是采用头插;
1.8版本:1.8中会将节点插入到链表尾部(因为JDK1.7是用单链表进行的纵向延伸,当采用头插法时会容易出现逆序且环形链表死循环问题。但是在JDK1.8之后是因为加入了红黑树使用尾插法,能够避免出现逆序且链表死循环的问题。)
扩容策略:
1.7版本:1.7中是只要不小于阈值就直接扩容2倍;
1.8版本:1.8的扩容策略会更优化,当数组容量未达到64时,以2倍进行扩容,超过64之后若桶中元素个数不小于7就将链表转换为红黑树,但如果红黑树中的元素个数小于6就会还原为链表,当红黑树中元素不小于32的时候才会再次扩容
扩容检查顺序:
1.7版本:是先进行扩容后进行插入的。
1.8版本:JDK1.8的时候则是先插入后进行扩容的。
流程图(口语化能够说出流程):
1.8版本:
1.7版本:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)