你说下HashMap的工作原理?
阿里云国内75折 回扣 微信号:monov8 |
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6 |
我在网上看了很多文章 各种长篇大论 原理细节、实在看不下去了所以着重讲一下HashMap 面试会问到的点
说人话 你们公司的集合 不会自研吧 假如 你们叫 锤子科技 那老板也不会要求你去写一个 CuiMap 去强制要求所有开发人员
所以 学习 HashMap 只需要 学习思想 比如下载 JDK 源码 编译 、打断点调试 参考写法 尝试的去 封装 、优化细节
而不是画一堆图更多的是实操面试的话 把下面 的 HashMap 几个重点背下来即可 面试官想要了解的是 你有没有过 源码的 阅读习惯 如果有的话 这样 也就说明 你是个静下心来钻研的人
这样今后项目中你也能有一份光、 发一份热
- HashMap 的存储机制
a. 在 Java 1.8 中如果链表的长度超过了 8且数组长度最小要达到64 那么链表将转化为红黑树链表长度低于6就把红黑树转回链表; - Java 1.8 中 HashMap 的不同
a. 在 Java 1.8 中如果链表的长度超过了 8 那么链表将转化为红黑树链表长度低于6就把红黑树转回链表;
b. 发生 hash 碰撞时Java 1.7 会在链表头部插入而 Java 1.8 会在链表尾部插入
c. 在 Java 1.8 中Entry 被 Node 代替换了一个马甲。 - put过程
a. 对Key求Hash值然后再计算下标
b. 如果没有碰撞直接放入桶中碰撞的意思是计算得到的Hash值相同需要放到同一个bucket中
c. 如果碰撞了以链表的方式链接到后面
d. 如果链表长度超过阀值( TREEIFY THRESHOLD==8)就把链表转成红黑树链表长度低于6就把红黑树转回链表
e. 如果节点已经存在就替换旧值
f. 如果桶满了(容量16*加载因子0.75)就需要 resize扩容2倍后重排 - get过程
a. 当我们调用get()方法HashMap会使用键对象的hashcode找到bucket位置
b. 找到bucket位置之后会调用keys.equals()方法去找到链表中正确的节点
c. 最终找到要找的值对象
HashMap 官网参考 :
阿里云国内75折 回扣 微信号:monov8 |
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6 |