java HashMap

      HashMap是最常用的Map实现,它按照键的HashCode 值存储数据,按照键可以直接获取它的值, 具有很快的拜候速度 。 HashMap最多只许可一笔记录的键为Null(多条会笼盖, 也就是key不克不及反复);许可多笔记录的值为 Null 。 非同步的也就是说线程不平安 。

java HashMap

文章插图

需要这些哦
电脑
intellij IDEA
第一步:HashMap实现道理 。 1什么是HashMap?
1、基于哈希表的一个Map接话柄现, 存储的对象是一个键值对对象(Entry<K,V>);
2、基于数组和链表实现, 内部维护着一个数组table, 该数组保留着每个链表的表头结点;查找时, 先经由过程hash函数计较key的hash值, 再按照key的hash值计较数组索引(取余法), 然后按照索引找到链表表头结点, 然后遍历查找该链表;

2HashMap数据布局
1、画了个示意图, 如下, 左边的数组索引是按照key的hash值计较获得, 分歧hash值有可能发生一样的索引, 即哈希冲突, 此时采用链地址法处置哈希冲突, 即将所有索引一致的节点组成一个单链表;

java HashMap

文章插图

3HashMap担当的类与实现的接口
1、HashMap接口示意图:如下所示
2、Map接口, 方式的寄义很简单, 根基上看个方式名就知道了, 后面会在HashMap源码阐发里具体申明
3、AbstractMap抽象类中界说的方式

java HashMap

文章插图

java HashMap

文章插图

java HashMap

文章插图

第二步:关头源码讲解1HashMap  是若何存储的?
a.底层是一个数组 tab
b. hash=hash(key) , 然后按照数组长度n和hash值, 决议当前需要put的元素对应的数组下标,
hash算法见红框 。

java HashMap

文章插图

2数组长度是固定的, HashMap 可以无限put(k,v) ,为什么?
HashMap  的元素个数大于threshold的时辰, 会进行resize() 扩容

java HashMap

文章插图

3若何实现扩容的?
扩容就是经由过程 resize() , 从头建立一个新数组, 对所有元素rehash,放到新数组响应位置 。
扩容价格是很大的, 所以良多公司编码规范都有一条, 合理设置hashMap的InitialCapicity,
禁止直接用HashMap()

java HashMap

文章插图

4Hash 冲突是什么?怎么解决这个问题?
1、Hash 冲突: 假如一个黉舍有366个同窗, 一年365天, 那么至少有两个同窗是统一生成日, 这就是hash冲突 。 用代码来说, 分歧的key 颠末计较p = tab[i = (n - 1) & hash] 对应统一个p

推荐阅读