hashCode()
hashCode的存在主要是用于查找的快捷性,如Hashtable,HashMap等,hashCode是用来在散列存储结构中确定对象的存储地址的;
如果两个对象相同,就是适用于equals(Java.lang.Object) 方法,那么这两个对象的hashCode一定要相同;
如果对象的equals方法被重写,那么对象的hashCode也尽量重写,并且产生hashCode使用的对象,一定要和equals方法中使用的一致,否则就会违反上面提到的第2点;
两个对象的hashCode相同,并不一定表示两个对象就相同,也就是不一定适用于equals(java.lang.Object) 方法,只能够说明这两个对象在散列存储结构中,如Hashtable,他们“存放在同一个篮子里”
hashCode是用于查找使用的,而equals是用于比较两个对象的是否相等的
解决hash碰撞方法
https://blog.csdn.net/lppl010_/article/details/80839160
开放定址法
当关键字key的哈希地址p=H(key)出现冲突时,以p为基础,产生另一个哈希地址p1,如果p1仍然冲突,再以p为基础,产生另一个哈希地址p2,…,直到找出一个不冲突的哈希地址pi ,将相应元素存入其中,通用的再散列函数形式:
Hi=(H(key)+di)% m i=1,2,…,n
其中H(key)为哈希函数,m 为表长,di称为增量序列
增量序列的取值方式不同,相应的再散列方式也不同
线性探测再散列
二次探测再散列
伪随机探测再散列
再哈希法
同时构造多个不同的哈希函数:
H
i
=
R
H
1
(
k
e
y
)
i
=
1
,
2
,
…
,
k
当
哈
希
地
址
H
i
=
R
H
1
(
k
e
y
)
发
生
冲
突
时
,
再
计
算
H
i
=
R
H
2
(
k
e
y
)
…
…
,
直
到
冲
突
不
再
产
生
不
易
产
生
聚
集
,
但
增
加
了
计
算
时
间
Hi=RH1(key) i=1,2,…,k 当哈希地址Hi=RH1(key)发生冲突时,再计算Hi=RH2(key)……,直到冲突不再产生 不易产生聚集,但增加了计算时间
Hi=RH1(key)i=1,2,…,k当哈希地址Hi=RH1(key)发生冲突时,再计算Hi=RH2(key)……,直到冲突不再产生不易产生聚集,但增加了计算时间
当哈希地址Hi=RH1(key)发生冲突时,再计算Hi=RH2(key)……,直到冲突不再产生
不易产生聚集,但增加了计算时间
链地址法
将所有哈希地址为i的元素构成一个称为同义词链的单链表,并将单链表的头指针存在哈希表的第i个单元中,因而查找、插入和删除主要在同义词链中进行
适用于经常进行插入和删除的情况
建立公共溢出区
将哈希表分为基本表和溢出表两部分,凡是和基本表发生冲突的元素,一律填入溢出表