
普歌-允异团队-HashMap面试题
发布日期:2021-05-08 03:42:12
浏览次数:5
分类:原创文章
本文共 874 字,大约阅读时间需要 2 分钟。
1.hashMap 工作原理
HashMap是基于hashing的原理,使用put(key, value)存储对象到HashMap中,使用get(key)从HashMap中获取对象。put()方法传递键和值时,我们先对键调用hashCode()方法,返回的hashCode用于找到bucket位置来储存Entry对象。
- HashMap是在bucket中储存键对象和值对象,作为Map.Entry。
key计算出一个hashcode,hashcode与“操作”计算出数组下标
在把put进来的key,value封装为一个entry对象
判断数组下标对应的位置,是不是空,如果是空则把entry直接存在该数组位置
如果该下标对应的位置不为空,则需要把entry插入到链表中
并且还需要判断该链表中是否存在相同的key,如果存在,则更新value
如果是JDK7,则使用头插法
如果是JDK8,则遍历链表,并且在遍历链表的过程中,统计当前链表的元素个数,如果超过8个,则先把链表转变为红黑树,并且把元素插入到红黑树中
2.HashMap在JDK7 ,JDK8 中的区别
- JDK8
通过数组+链表+红黑树来实现
使用了红黑树保证了插入和查询了效率,所以实际上JDK8中的Hash算法实现的复杂度降低了
数组扩容的条件也变化了,只会判断是否当前元素个数是否查过阈值,而不再判断当前put进来的元素对应的数组下标位置是否有值。 - JDK7
数组+链表实现
链表的插入是用的头插法,而JDK8中改为了尾插法
先扩容再添加新元素,JDK8 先添加新元素然后再扩容
3. DK8中链表转变为红黑树的条件?
链表中的元素的个数为8个或超过8个。满足当前数组的长度大于或等于64才会把链表转变为红黑树。
4 .链表转变为红黑树的目的
解决链表过长,导致查询和插入效率慢的问题
如果要解决这个问题,也可以通过数组扩容,把链表缩短也可以解决这个问题
在数组长度还不太长的情况,可以先通过数组扩容来解决链表过长的问题。
-
作者:麦克猫Cat
-
本文版权归作者和CSDN共有,欢迎交流
发表评论
最新留言
关注你微信了!
[***.104.42.241]2025年03月26日 00时58分43秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
openstack安装(六)镜像glance服务安装
2021-05-08
openstack安装(九)网络服务的安装--控制节点
2021-05-08
shell编程(六)语言编码规范之(变量)
2021-05-08
linux杂谈之特殊字符的打印和在各种软件如何打出
2021-05-08
vim杂谈(三)之配色方案
2021-05-08
vim杂谈(五)之vim不加载~/.vimrc
2021-05-08
Linux杂谈之终端快捷键
2021-05-08
vimscript学习笔记(二)预备知识
2021-05-08
vimscript学习笔记(三)信息打印
2021-05-08
awk杂谈之数组习题
2021-05-08
Linux网络属性配置详解
2021-05-08
Python(三十)类的理解
2021-05-08
Extjs布局详解
2021-05-08
Android数据库
2021-05-08
C语言之指针再涉(二)
2021-05-08
application类
2021-05-08
Linux基础命令(十四)软件安装的后续
2021-05-08
Perl(二)Perl简介
2021-05-08
HTML基础,块级元素/行内元素/行内块元素辨析【2分钟掌握】
2021-05-08