1、什么是HashMap?HashMap什么时候用?

HashMap与ArrayList,LinkedList,HashSet等集合的区别在于它用指定Key找到指定Value

注意:hashmap相同的key会被覆盖。在存储键值对应的关系时用到HashMap!

(1)HashMap 是一个散列表,它存储的内容是键值对(key-value)映射。
(2)HashMap 继承于AbstractMap,实现了Map、Cloneable、java.io.Serializable接口。
(3)HashMap 的实现不是同步的,这意味着它不是线程安全的。它的key、value都可以为null。此外,HashMap中的映射不是有序的。
2、HashMap存储数据的特点?
(1)无序
(2)无索引
(3)不能存储重复元素
3、hashmap原理
(1)hashmap是基于哈希表对map接口的实现,HashMap具有较快的访问速度,但是遍历顺序却是不确定的。

(2)HashMap提供所有可选的映射操作,并允许使用null值和null键

(3)HashMap并非线程安全,当存在多个线程同时写入HashMap时,可能会导致数据的不一致

(4)HashMap采用了数组+链表+红黑树的存储结构,HashMap数组部分称为哈希桶,当链表长度大于8时,链表数据将以红黑树的形式进行存储,当长度降到6时,转成链表。

4、HashMap是如何解决Hash冲突的

(1)首先hashmap底层采用了数组这样的结构来存储数据元素,数组的默认长度是16,当我们通过put方法去添加数据的时候,hashmap会根据Key的hash值进行取模运算,最终把这个值保存在数组中的某个位置。但是两个不同hash值的key最终取模以后会落到同一个数组下标,所以hashmap引入了一个链式寻址法,来解决hash冲突的问题,将存在冲突的key组成一个单向链表,采用尾插法把key储存到链表的一个尾部,另外为了避免链表过长,导致查询效率下降,所以当链表长度大于8并且数组长度大于等于64时,hashmap会将当前的链表转化为红黑树,从而减少链表数据查询的一个时间复杂度提升查询效率,

(2)最后再补充一点,解决hash冲突的方法有很多,比如

第一个:再hash法,也就是说如果某个hash函数产生了冲突,用另外一个hash函数进行计算,比如像布隆过滤器就采用了这个一个方法

第二个:开放寻址法,就是直接从冲突的数组位置往下寻找一个空的数组下标进行数据存储,这个在TreadLocal里面有使用到

第三个:建立公共溢出区,把冲突的key统一放到一个公共溢出区里面进行存储

最后修改:2023 年 03 月 11 日
如果觉得我的文章对你有用,请随意赞赏