对HashMap的深度理解
1、什么是HashMap
基于Hash算法的Map(图),是一种数据结构。
List、Set、Map、Queue都是数据结构
数据结构:
线性结构(数组、列表List、队列、栈……)ps:可以理解为连成一条的房子
树(二叉树、B树……)
堆
图
2、HashMap中的Hash
hash是一种广义的算法,是一种思想。
什么是Hash?散列(中文音译哈希)。
思路:把任意长度的输入,通过散列算法变成固定长度的输出(提炼、摘要)
(ps:人间本来就很艰难,不要拆穿人家了。 摘要:人艰不拆)
想要查看字符的哈希值可以调用hashCode()方法 对象.hashCode()
对于同一个hash算法。同样的输入,会有同样的输出。ps:同样的输出可能有完全不一样的输入
【特点】(有图解)
1、不同的输入,进过hash算法之后的输出可能会重复
2、很难找到逆向的规律(ps:根据输出无法反推出输入是什么)
应用场合?
提高存储空间的利用率
提高查询的效率
做数字签名保证数据传递的安全性
作为加密的一种方式
3、初步认识HashMap
数组+hash算法就组成了HashMap
特点:查找非常快!(以为着效率高)
(ps:数组100w个元素,查找一个你要的元素,平均要50w次。链表LinkedList比数组还慢~)
第一个认识:它的内部的基础结构都是数组。
第二个认识:put进去的键值对是无序的。
第三个认识:put一个key-value的时候,先根据key计算一个hash值,得出存放的位置。
(ps:在通过hash算法计算不同的key时可能会输出相同的hash值,就会产生hash冲突,而hash冲突会导致查找速度变慢)
HashMap如何处理【hash冲突】?
首先需要认识HashMap类中几个重要属性:
capacity:容量,桶的个数(ps:数组中的每个元素都是一个桶)
size:实际装的数量
loadFactor:负载因子,决定了容量什么时候扩大(ps:size到了容量的百分之多少,就扩大容量)
threshold:扩容的阈值,size达到多少个数量的时候,就扩大容量,等于capacity*loadFactor
当冲突有点多,Node的next属性不为空时,就组成链表
当冲突非常多,一个桶后面跟了7个桶,就升级为红黑树
(ps:下方图解)