来看一道题,问HashMap是用下列哪种方法来解决哈希冲突的?
A 开放地址法
B 二次哈希法
C 链地址法
D 建立一个公共溢出区
答案是:C
解决哈希冲突的方法有三种,分别是:
- 开放地址法:寻找下一个为空的数组下标,而后将冲突元素存储
- 再散列法(二次哈希法):再次使用一个不同的哈希算法再计算一次 (第一次%16换另一个数进行%运算)
- 链地址法(拉链法):将所有冲突元素按照链表存储,冲突后时间复杂度变为O(1+n)n为冲突元素个数)[hashMap就是用这种方法]
首先来了解一下什么是哈希表
哈希表是以(Key,Value):数值的形式存储数据的
根据相应的哈希算法计算key,返回值即为V存储的数组下标
哈希算法:f(K) --- . int即为V需要存储的数组下标
为什么会造成哈希冲突呢?
用一个数去模运算,取得余数就是所要存储数组数据的下标,但是余数可能会存在一样的,这样就导致一样余数的户数无处存储,所以就造成了哈希冲突.
哈希冲突解决思路:
哈希算法计算的两个不同对象的哈希值相等的情况
eg:1 % 16 == 17 % 16[1和17是不同的key值]--->就是哈希冲突了
HashMap中用链地址法来解决