HashMap是如何解析Hash冲突的?
普通人的回答:HashMap解决哈希冲突的方式,我觉得是用那个链表的方式,单向链表。如果存在冲突的话,他会把那个从做这样的一个键值对啊,会保存到那个链表的尾部,对这样。
老司机的回答:这个问题呢,我需要从几个方面来回答,首先HashMap底层是采用了数组的这样一个结构来存储数据,元素数组的默认长度是16,当我们通过put方法去添加数据的时候啊,它现在不会根据key的哈希值进行取模运算,最终把这样一个值保存到数组的一个指定位置,但是这样一个设计方式会存在Hash冲突的问题,就是说两个不同哈希值的Key最终取模以后会落到同一个数组下标,所以hashMap引入了一个链式寻址法来解决哈希冲突的问题,就是说对存在冲突的Key呢?hashMap这些可以组成一个单向链表,然后采用尾插法把这个Key呢,保存到列表的尾部。另外为了避免列表过长导致我的查询效率下降,所以当列表长度大于8并且数组长度大于等于64的时候,hashMap会把当前列表转化为红黑树,从而减少列表数据查询的一个时间复杂度的一个问题来提升查询效率。解决哈希冲的方法有很多,比如说第一个在哈希法,也就说如果某个哈希函数产生了冲突,那么再用另外一个哈希函数进行计算,比如说像布隆过滤器就采用这样一个方法。第二个开放巡址法,就是说,直接从冲突的数组位置向下去寻找一个空的数值下标进行数据的存储,这个在线程变量threadlocal里面有使用到。第三个是建立公共溢出区,就是说把存在冲突的key统一放在一个公共的溢出区里面去进行存储。
哈希冲突这个问题呢,在业务开发的过程中啊,比较少遇到,但是从解决问题的方法里面可以学到很多技术的设计思想,不管是为了面试还是为了长期的职业发展,我认为这个技术点都是有必要去深度理解的基础知识。