聊一聊HashMap

HashMap 在 Java 中是一个使用高频的数据结构,JDK1.8 以后 HashMap 进行了一次翻天覆地的改变,本文基于 JDK1.8 分析一下 HashMap

存储结构转换

在 JDK1.8 以前 HashMap 采用的是数组+链表的结构,JDK1.8 以后又引入了红黑树的结构,会在链接和红黑树之间转换,结合源码分析一下 HashMap 对数组+链表数组+红黑树的转换
首先看一下数据的存储结构

 transient HashMap.Node<K, V>[] table;

HashMap 定义了一个 Node 的数组,Node 的定义

   static class Node<K, V> implements Entry<K, V> {
   
        final int hash;
        final K key;
        V value;
        HashMap.Node<K, V> next;
        // ....省略
  }

Node 中包含了四个属性hashkeyvaluenext

  • keyvalue是调用 HashMap 的put()方法传进来的。
  • hash 是判断 key 是否重复的关键
  • next 用于构建链表

所以 HashMap 默认是一个数组+链表的形式

list

链表是否要转换成红黑树,是在调用put()方法添加数据时判断的,跟着源码分析链表转换成红黑树的过程

put()方法调用的是putVal()方法,

    final V putVal(int hash, K key, V value, boolean onlyIfAbsent, boolean evict) {
   
        // ...省略
        while (true) {
   
            if ((e = ((HashMap.Node) p).next) == null) {
   
                ((HashMap.Node) p).next = this.newNode(hash, key, value,(HashMap.Node) null);
                //转换成红黑树
                if (binCount >= TREEIFY_THRESHOLD - 1) {
   
                    this.treeifyBin(tab, hash);
                }
                break;
            }
            
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值