Object类的equals() and hashCode()的实现

it2023-10-19  70

equals()hashcode()

equals()

public boolean equals(Object anObject) { if (this == anObject) { return true; } if (anObject instanceof String) { String aString = (String)anObject; if (!COMPACT_STRINGS || this.coder == aString.coder) { return StringLatin1.equals(value, aString.value); } } return false; }

在比较两个值是否相等时候一般使用==,而equals比较的是两个Java对象的地址(引用是否相等)。

而在String,Integer等封装类中,这些类的equals方法已经重写,可以说是比较内容了。


hashcode()

返回对象的hashcode值。

为什么覆盖equals方法时总要覆盖hashCode方法?

通用约定:如果两个对象根据equals比较是相等的,那这两个对象调用hashCode方法返回的结果必须是一样的。

如果相同的对象具有不同的hashCode,那么将对象放入hashMap中,对象会被存到其中一个桶中,但当你去get 时,虽然是同一个对象,但是由于生成的hashCode不同,会到不同的桶中去找,此时便找不到那个对象。

初学者可以简单理解,hashCode方法实际上返回的就是对象存储的物理地址(实际可能并不是)。

当集合要添加新的元素时,先调用这个元素的hashCode方法得到hash值,hash值通过哈希算法能定位到下标。如果这个位置上没有元素,它就可以直接存储在这个位置上,不用再进行任何比较了;如果这个位置上已经有元素了,就调用它的equals方法与新元素进行比较,相同的话就覆盖v值,不相同就将元素添加在链表的末尾。所以这里存在一个冲突解决的问题。这样一来实际调用equals方法的次数就大大降低了,几乎只需要一两次。

Java对象的eqauls方法和hashCode方法是这样规定的: 1、相等(相同)的对象必须具有相等的hash值。 2、如果两个对象的hashCode相同,它们并不一定相同。

最新回复(0)