HashMap添加元素的过程(重点详解)

以jdk7为例说明:
  HashMap map = new HashMap();
在实例化以后,底层创建了一个长度为16的一位数组Entry[] table。
  ···可能已经执行过多次put操作了···
map.put(key1,value1)
首先会调用key1所在类的hashCode()方法计算key1的哈希值,然后通过某种算法计算出key1在Entry数组中的存放位置。
如果此位置上没有存放数据,则(key1-value1)添加成功。
如果此位置上有数据,则比较key1和已经存放的数据(一个或多个数据,其中多个数据是以链表的形式存储)的哈希值
  如果key1的哈希值和已经存放的数据的哈希值都不相同,则(key1-value1)添加成功。
  如果key1的哈希值和已经存放的某一个数据(key2-value2)的哈希值相同,则调用key1所在类的equals(key2)方法
    如果equals返回false,则(key1-value1)添加成功。
    如果equals返回true,则使用value1替换value2。

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

jdk8中:
  new HashMap():底层没有创建一个长度为16的数组。
  jdk8底层的数组是:Node[],而非Entry数组。
  首次调用put()方法时,底层去创建长度为16的数组。
  jdk7底层结构:数组+链表。
  jdk8底层结构:数组+链表+红黑树。
  当数组的某一个索引位置上的元素以链表形式存在的数据个数>8且当前数组的长度>64时,此时此索引位置上的所有数据由数组+链表改为使用数组+红黑树存储,当数组的某一个索引位置上的元素以红黑树形式存在的数据个数<6时,此时此索引位置上的所有数据由数组+红黑树变为使用数组+链表存储。

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值