您现在的位置是:首页 >技术杂谈 >HashMap 简述网站首页技术杂谈
HashMap 简述
简介HashMap 简述
前言
HashMap 是开发中常用的一种数据结构,通常用做返回值,计算比对等,会经常用到;
一、HashMap的数据结构
jdk8之后,数据结构是 数组+链表 或者 数据+ 链表+红黑树实现的;
二叉树,红黑树?
红黑树是二叉树的进化版本:
- 1、左子树的所有节点的值均小于其根节点的值。
- 2、右子树的所有节点的值均大于其根节点的值。
- 3 、左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树
- 这里选择红黑树的原因具体可以参考我的另一篇文章 mysql索引 因为二叉树是有缺陷的,它可能退化成一个链表,而非数,这样查找效率依然是低下的;
二、HashMap存储数据的大致过程
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的一个简单介绍,主要说明了哈希冲突的由来,以及底层存储结构的选择的理由;
风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。