什么是哈希表

哈希表(Hash table)又叫散列表,指的是根据关键码值来直接进行访问的数据结构(即Key Value结构)。也就是说,通过映射函数(f(key))将每一个关键码值都映射到哈希表中一个位置,通过关键码值来访问数据,以加快查找的速度(即O(n))。这个映射函数叫做散列函数,存放记录的数组叫做散列表。
给定表M,存在函数f(key),对任意给定的关键字值key,代入函数后若能得到包含该关键字的记录在表中的地址,则称表M为哈希(Hash)表,函数f(key)为哈希(Hash) 函数。

什么是哈希冲突

对于不同的关键字,可能得到同一个哈希地址,即 f(key1) = f(key2) 且 key1 ≠ key2,对于这种情称为哈希冲突,也叫哈希碰撞

如何减少哈希冲突

Java 的 HashMap 中,采用的是取模算法,亦可以考虑使用offset来减少hash冲突

如何处理哈希冲突

hash冲突不可避免,在Java 的 HashMap 中,使用的是链表的形式处理hash冲突,亦可多次hash直到不冲突,或建立公共区域存放冲突的key,或使用开放地址,往相邻的方向寻找未使用的存储地址

如何看待链表处理哈希冲突

通过KV结构的特点可知,该数据结构主要是解决无序数据的查询效率问题,但是由于引入了链表来解决hash冲突,在极端情况下查询会非常慢,因为链表的查询时间复杂度为O(n),因此在Java 的 HashMap 中又引入了红黑树,来平衡查询效率,当然由链表与红黑树的转换之间也存在着性能开销,故在转换条件上也有一定的限制,在默认情况下,hashMap的长度达到64,链表长度大于8时才会进行红黑树转换

参考文献:
哈希表
面试官:哈希表都不知道,你是怎么看懂HashMap的?


老污的猫
30 声望5 粉丝