HashMap基本结构

一、结构

  • hashMap采用键值对存储,底层使用数组额链表的结构。
  • HashMap初始化容量是16,即初始化数组大小为16,数组的每个位置都可以看个一个桶,每个桶存放一个链表Entry,Entry包含了四个字段,key、value、next和hash,采用拉链法解决冲突,如下图所示:
    在这里插入图片描述
  • 拉链法,HashMap的put操作时,比如插入<K1, V1>时,先计算K1的hashCode = hash,hash与hashMap容量length - 1进行与运算得到元素放的位置在哪个桶,当有元素放入相同的桶时,链表下拉成为链,如上图位置标号为5的桶。
  • hashMap允许插入为null的键值对,由于null无法调用hashCode()方法,所以hashMap强制使用第0个桶存放为null的键值对。其中实现方法如下:
private V putForNullKey(V value) {
    for (Entry<K,V> e = table[0]; e != null; e = e.next) {
        if (e.key == null) {
            V oldValue = e.value;
            e.value = value;
            e.recordAccess(this);
            return oldValue;
        }
    }
    modCount++;
    addEntry(0, null, value, 0);
    return null;
}

二、扩容

  • 当存放键值对数量超过临界值时,hashMap容量扩容为原来的2倍,其中主要参数有:
  • capacity :hashMap容量大小,初始默认值为16;
  • size:hashMap键值对数量;
  • threshold:size临界值,当size超过这个值时,触发扩容;
  • loadFactor:hashMap负载因子,容量所能使用的比例大小,hashMap默认值为0.75,也就是当键值对超过总容量的75%的时候会进行扩容。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值