当前位置: 首页 > article >正文

HashMap底层原理

jdk1.8之后hashmap底层结构

jdk1.8之后,是哈希表数据结构,也可以说是数组+链表或红黑树,下图是没有添加数据的一个hashmap。

37a22dcf419044ff8ca60494bcd81b8c.png

现在开始添加数据,看下面具体步骤

put操作

        如下,我们来简单看看hashmap的put源码,关注putVal的前三个参数就行,当增加一对key、value的时候,底层会做哈希运算,hash(key),它会将你的key映射到上面数组的某个位置。

1. 如果这个位置没有值,直接插入。

2. 如果有值,代表发生了哈希冲突,这时候又要分两种情况,key相同就覆盖,不同就放入链表或红黑树,也许你不懂为什么是链表或者红黑树,接着往下看。

public V put(K key, V value) {
        return putVal(hash(key), key, value, false, true);
    }

        如下图,红色是我们插入的值,4个连续红色的就是发生了哈希冲突,key不相同,就形成了链表。这里链表的插入是尾插法

85e076836ecd4cf8942d8f7067ed0aae.png

        而当链表的长度>=8并且数组长度>=64后,这个链表才会转化为红黑树。转化操作看起来很麻烦费事,其实大大提升了hashmap的查找效率,假如我们在数据量大的时候不转为红黑树,一条链表挂得很长,那么查该链表里面某个数据的时间复杂度就是O(n),如果是红黑树,时间复杂度就是O(log n)。d6ff9a1e8c3d4892aa8c965930cf1a29.png     

get操作

        例如hashmap.get(key),此时底层就会根据key计算哈希值,找到底层数组下标位置,如果是链表,依次对比key是否一样。如果是红黑树,根据红黑树进行查找对比。

jdk 1.7 之前hashmap底层原理

        只说和1.8之后不一样的地方。

1. 底层是数组加链表,也就是拉链法,没有红黑树。

2. 链表的插入是头插法


http://www.kler.cn/a/406877.html

相关文章:

  • 【1.2 Getting Started--->Installation Guide】
  • vue2-代理服务器插槽
  • Python数据结构day2
  • Redis的特性ubuntu进行安装
  • 【从零开始的LeetCode-算法】3233. 统计不是特殊数字的数字数量
  • 3D超声重建技术
  • 24.11.23 Ajax
  • 天线相位缠绕
  • openeuler设置IP
  • 解读InnoDB数据库索引页与数据行的紧密关联
  • ssm168基于jsp的实验室考勤管理系统网页的设计与实现+jsp(论文+源码)_kaic
  • 英文版本-带EXCEL函数的数据分析
  • 力扣 LeetCode 236. 二叉树的最近公共祖先(Day10:二叉树)
  • Swift从0开始学习 并发性 day4
  • 三次握手后的数据传输
  • Atcoder Beginner Contest 381
  • el-table :span-method 合并单元格(2.0)
  • 整站使用Vue(工程化)
  • C语言练级->##__VA_ARGS__(可变参数)的用法
  • uniapp中使用uni.$emit和uni.$on进行页面通讯传值
  • 3-测试go-redis+redsync实现分布式锁 --开源项目obtain_data测试
  • VRRP实现出口网关设备冗余备份
  • win10中使用ffmpeg和MediaMTX 推流rtsp视频
  • JAVA下载EXCEL,PDF文件之后无法打开,提示文件损坏
  • electron主进程和渲染进程之间的通信
  • 大数据学习18之Spark-SQL