您现在的位置是:首页 >技术杂谈 >HashMap 简述网站首页技术杂谈

HashMap 简述

寂寞旅行 2024-06-11 15:20:04
简介HashMap 简述


前言

HashMap 是开发中常用的一种数据结构,通常用做返回值,计算比对等,会经常用到;


一、HashMap的数据结构

jdk8之后,数据结构是 数组+链表 或者 数据+ 链表+红黑树实现的;

二叉树,红黑树?
红黑树是二叉树的进化版本:

  • 1、左子树的所有节点的值均小于其根节点的值。
  • 2、右子树的所有节点的值均大于其根节点的值。
  • 3 、左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树
  • 这里选择红黑树的原因具体可以参考我的另一篇文章 mysql索引 因为二叉树是有缺陷的,它可能退化成一个链表,而非数,这样查找效率依然是低下的;

二、HashMap存储数据的大致过程

hash示意图

1 哈希值

当我们存入一对key-value 的时候,我们对这个节点的key进行哈希算法运算,算好之后放入到Node 中,这样就有了它自己的唯一下标(哈希值对当前数组长度取模),不通的哈希值有不同的下标;

2 什么是哈希冲突?

可是很多key的hashcode值如果相同,下标相同怎么办? 于是出现了链表结构,就是当很多key的hashcode值相同的时候,即哈希冲突,那么此时会在这个下标下面挂出一个链表,用来存储产生了哈希冲突的key,那么它的下标如何计算? 哈希值都是同一个,应该是对当前所在链表的长度取模,作为它的唯一下标;

3 为何有两种数据结构?

数组+链表 或者 数据+链表+红黑树

当一直产生哈希冲突,链表长度超过8个之后,此时查询效率低下,所以采用了红黑树的结构,方便快速查找,提高查询效率

三、HashMap常用知识

  • HashMap中有两个重要的参数:初始容量大小和加载因子,初始容量大小是创建时给数组分配的容量大小,默认值为16,加载因子默认0.75f,用数组容量大小乘以加载因子得到一个值,一旦数组中存储的元素个数超过该值就会调用rehash方法将数组容量增加到原来的两倍,专业术语叫做扩容.
  • 在做扩容的时候会生成一个新的数组,原来的所有数据需要重新计算哈希码值重新分配到新的数组,所以扩容的操作非常消耗性能.
  • 所以HashMap的大小通常是2的幂次方;
  • HashMap存储的键值对,key重复的时候,value 会被更新, 允许key为 null 的存在
  • HashMap的遍历
    • keys
    • vlaues
    • entryset
    • foreach
    • iterator

总结

这里仅仅是对于hashmap的一个简单介绍,主要说明了哈希冲突的由来,以及底层存储结构的选择的理由;

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。