Java基础七、HashMap

七、HashMap
(1)概念

HashMap是一个用于存储Key-Value键值对的集合

(2)数据结构
  1. JDK1.7中HashMap数据结构

数组+链表的形式构成

  1. JDK1.8中HashMap数据结构

数组+链表+红黑树构成

  1. 数据结构图

在这里插入图片描述

这张图囊括了HashMap中基础的几个点:

  1. Java中HashMap的实现的基础数据结构是数组,每一对key->value的键值对组成Entity类以双向链表的形式存放到这个数组中
  2. 元素在数组中的位置由key.hashCode()的值决定,如果两个key的哈希值相等,即发生了哈希碰撞,则这两个key对应的Entity将以链表的形式存放在数组中
  3. 调用HashMap.get()的时候会首先计算key的值,继而在数组中找到key对应的位置,然后遍历该位置上的链表找相应的值。
  4. 在Java 8中如果桶数组的同一个位置上的链表数量超过一个定值,则整个链表有一定概率会转为一棵红黑树。
(3)基本特性
// 默认初始容量为16
static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; 
// 默认负载因子为0.75
static final float DEFAULT_LOAD_FACTOR = 0.75f;
// 当add一个元素到某个位桶,其链表长度达到8时将链表转换为红黑树  
static final int TREEIFY_THRESHOLD = 8; 
// Hash数组(在resize()中初始化)
transient Node<K,V>[] table;
// 元素个数
transient int size;
// 容量阈值(元素个数大于等于该值时会自动扩容)  
int threshold;
(4)基本原理

​ HashMap是基于Hash算法实现的,通过put(key, value)存储,get(key)获取,当传入key时,HashMap会根据key的hashCode()方法计算取模hash值,将hash值转换成数组的下标。

​ 对于put(key, value)存储:下标位置上如果没有任何元素,就把Node添加到这个位置上。如果说下标对应的位置上有链表。此时,就会拿着k和链表上每个节点的k进行equal。如果所有的equals方法返回都是false,那么这个新的节点将被添加到链表的末尾。如其中有一个equals返回了true,那么这个节点的value将会被覆盖。

​ 对于get(key)获取:如果这个位置上什么都没有,则返回null,如果这个位置上有单向链表,那么它就会拿着参数K和单向链表上的每一个节点的K进行equals,如果所有equals方法都返回false,则get方法返回null。如果其中一个节点的K和参数K进行equals返回true,那么此时该节点的value就是我们要找的value了。

(5)链表树化

指的就是把链表转换成红黑树,树化需要满足以下两个条件:

  • 链表长度大于等于8
  • table数组长度大于等于64
  1. 关键代码
// 1.遍历这条链子上所有数据
for (int binCount = 0; ; ++binCount) {
    if ((e = p.next) == null) {
        p.next = newNode(hash, key, value, null);
        //2.判断链表长度是否大于TREEIFY_THRESHOLD 8,并且可能执行treeifyBin方法
        if (binCount >= TREEIFY_THRESHOLD - 1)
        {
            // treeifyBin()就是将链表转换成红黑树。
            treeifyBin(tab, hash);
        }
        break;
    }
    if (e.hash == hash &&
            ((k = e.key) == key || (key != null && key.equals(k)))) {
        break;
    }
    p = e;
}

| (key != null && key.equals(k)))) {
break;
}
p = e;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

徐工_CH

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值