博客
关于我
普歌-允异团队-HashMap面试题
阅读量:361 次
发布时间:2019-03-05

本文共 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共有,欢迎交流

转载地址:http://tthg.baihongyu.com/

你可能感兴趣的文章
279 完全平方数(bfs)
查看>>
875 爱吃香蕉的珂珂(二分查找)
查看>>
桌面图标的自动排列图标
查看>>
第十一届蓝桥杯python组第二场省赛-数字三角形
查看>>
数字三角形的无返回值的深度优先搜索解法
查看>>
完全背包问题的简化思路
查看>>
Jquery添加元素
查看>>
Jquery使用需要下载的文件
查看>>
BST中某一层的所有节点(宽度优先搜索)
查看>>
广度优先搜索
查看>>
猜字母
查看>>
Eclipse导出项目出现resource is out of sync with the file...错误
查看>>
Linux网络环境配置(设置ip地址)
查看>>
Idea使用Spring Initializr来快速创建springboot项目
查看>>
Dijkstra算法的总结
查看>>
SpringCloud和SprinBoot之间的关系
查看>>
javascript定义变量及数据类型介绍
查看>>
C语言的运算符和表达式
查看>>
椭圆曲线密码系统——椭圆曲线
查看>>
Vue实现选项卡功能
查看>>