目录
简介:Hash叫做‘散列表’,就是把任意长度输入,通过散列算法,变成固定长度输出,该输出结果是散列值。其实这种转换是一种压缩映射,散列表的空间通常小于输入空间,不同的输入可能会散列成相同的输出,所以不能从散列表来唯一确定输入值,这就出现了Hash冲突;
一丶什么是Hash冲突
Hash冲突是指在哈希表中,不同的关键字通过哈希函数计算得到的哈希值却相同的情况。这种情况会导致哈希表的性能下降,因为哈希表需要在同一位置上存储多个数据。
二丶如何解决Hash冲突
- 开放定址法:当发生冲突是时,继续寻找下一个可用的位置,直到找到一个空闲的位置为止。这种方法可能会导致聚集现象,即冲突位置附近的空间被更频繁的使用;
- 链地地址(拉链法):将哈希值相同的元素构成一个同义词的单链表,并将单链表的头指针存放在哈希表的第i个单元。查找、插入和删除主要在同义词链表中进行。这种方法需要额外的内存来存储链表,但可以避免聚集现象。HashMap采用的就是链地地址法来解决Hash冲突;
- 再哈希法:当发生冲突时,使用另一个哈希函数对键进行再次哈希,以确定下一个位置。这种方法需要选择一个合适的再哈希函数,以避免过多的冲突;
- 建立公共溢出区:将存在冲突的元素统一放在一个公共的溢出区;
HashMap在JDK1.8版本中通过链式寻址法以及红黑树来解决Hash冲突的问题。其中红黑树是为了优化Hash表的链表过长导致时间复杂度增加的问题。当链表长度大于8并且Hash表的容量大于64时,再向链表添加元素,就会触发链表向红黑树的一个转化。这种方法结合链地地址和再哈希法的优点,避免了过多的内存消耗,又优化了查找效率;
结尾:喜欢的朋友点个赞吧!!!