HashMap
Hash :散列,通过关于键值(key)的函数,将数据映射到内存存储中一个位置来访问。这个过程叫做Hash,这个映射函数称做散列函数,存放记录的数组称做散列表(Hash Table),又叫哈希表。JAVA函数hashCode()即请求对象的哈希值。
哈希表、散列表
保存“键值对”
方法
put(k, v)
get(k)
remove(k)
size()
1.1哈希运算过程
HashMap颞部使用Entry[]数组来存放数据
数组默认的初始长度是16
调用key.hashCode()获取键的哈希值
用哈希值来计算下标i
把键值对封装成Entry对象,放入i位
空位置,直接放入
有数据,依次用equals()比较键是否相等
找到相等的,覆盖值
没有相等的,用链表连接在一起
负载率/加载因子到0.75(数据数量/数组容量)
(注:装填因子(载荷因子)
散列表的载荷因子定义为:
α = 填入表中的元素个数 / 散列表的长度.
α是散列表装满程度的标志因子。由于表长是定值,α与“填入表中的元素个数”成正比,所以,α越大,表明填入表中的元素越多,产生冲突的可能性就越大;反之,α越小,标明填入表中的元素越少,产生冲突的可能性就越小。实际上,散列表的平均查找长度是载荷因子α的函数,只是不同处理冲突的方法有不同的函数。
对于开放定址法,荷载因子是特别重要因素,应严格限制在0.7-0.8以下。超过0.8,查表时的CPU缓存不命中(cache missing)按照指数曲线上升。因此,一些采用开放定址法的hash库,如Java的系统库限制了荷载因子为0.75,超过此值将resize散列表。
(原文:https://blog.csdn.net/yt618121/article/details/81162836)
所有数据重新执行哈希运算,放入新数组
[if !supportLists]l [endif]jdk1.8
链表长度到8,转成红黑树
树上的数据减少到6,转会成链表
哈希运算测试
学生对象,对应成绩
stu1 95
stu2 91
放入重复的学生,对应一个新的值,覆盖之前的成绩