HashMap

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

放入重复的学生,对应一个新的值,覆盖之前的成绩

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容