两个不相等的对象,是有可能拥有相同的hashcode的,这种情况被称为“哈希碰撞”。
如下所示:
public class HashCodeExample { public static void main(String[] args) { String str1 = "FB"; String str2 = "Ea"; System.out.println("str1.hashCode(): " + str1.hashCode()); System.out.println("str2.hashCode(): " + str2.hashCode()); System.out.println("str1.equals(str2): " + str1.equals(str2)); } }
运行结果为:
str1.hashCode(): 2236 str2.hashCode(): 2236 str1.equals(str2): false
在这个例子中,尽管字符串 “FB” 和 “Ea” 不相等(equals()
返回 false
),但它们的哈希码却是相同的(都为2236)。
在哈希表数据结构(如 HashMap
、HashSet
)中,哈希碰撞是通过以下方式处理的:
1、链地址法
每个哈希桶存储一个链表或其它结构的所有元素,在发生碰撞时,将新元素添加到桶内的链表中。
2、开放地址法
在碰撞时,寻找其他空闲的桶来存储元素,这通常通过线性探测、二次探测或双重哈希等方式实现。