JDK8 和JDK7 的HashMap在底层实现原理

JDK7
HashMap map = new HashMap();
在实例化后,底层创建长度是16的一维数组Entry[] table
…多次执行put();…

map.put( key , value ):

  • 首先调用key所在类的hashCode() 计算可以的哈希值,此哈希值经过某种算法计算以后,得到在Entry数据中存放的位置。
  • 如果此位置上的数据为空,此时key-value添加成功。
  • 如果不为空,意味着此位置上存在一个或多个数据(以链表的形式存在),比较key和已经存在的一个或多个数据的哈希值
  • 如果key和已经存在的数据的哈希值都不相同,此时key-value添加成功
  • 如果key的哈希值与某一个存在的数据的哈希值相同,继续比较
  • 调用key所在类的equals() 进行比较,return false 添加成功, return true 使用value替换旧值

在不断的添加过程中,会涉及到扩容问题,当超出临界值且要存放的位置非空时,默认的扩容方式:扩容为原来容量的 2 倍,并将所有的数据复制过来。

JDK8 和JDK7 的HashMap在底层实现方面的不同:

  1. new HashMap() : 底层没有创建一个长度为16的数组
  2. jdk8底层的数组是Node[] 而非Entry[]
  3. 首次调用put()方法时,底层创建长度为16的数组
  4. jdk7底层结构:数组 + 链表
    jdk8底层结构:数组 + 链表 + 红黑树
    5.当数组的某一个索引位置上的元素以链表形式存在的个数 ≥ 8 且当前的数组长度 ≥ 64时,此索引位置上的所有数据改用红黑树存储
默认容量:16
默认加载因子:0.75
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值