equals方法一般是判断两个对象是否相等,可以重写。
Object中的equals方法比较的规则是这样的:
指示其他某个对象是否与此对象“相等”。
equals 方法在非空对象引用上实现相等关系:
-
自反性:对于任何非空引用值 x,x.equals(x) 都应返回 true。
-
对称性:对于任何非空引用值 x 和 y,当且仅当 y.equals(x) 返回 true 时,x.equals(y) 才应返回 true。
-
传递性:对于任何非空引用值 x、y 和 z,如果 x.equals(y) 返回 true,并且 y.equals(z) 返回 true,那么 x.equals(z) 应返回 true。
-
一致性:对于任何非空引用值 x 和 y,多次调用 x.equals(y) 始终返回 true 或始终返回 false,前提是对象上 equals 比较中所用的信息没有被修改。
-
对于任何非空引用值 x,x.equals(null) 都应返回 false。
Object 类的 equals 方法实现对象上差别可能性最大的相等关系;即,对于任何非空引用值 x 和 y,当且仅当 x 和 y 引用同一个对象时,此方法才返回 true(x == y 具有值 true)。
注意:当此方法被重写时,通常有必要重写 hashCode 方法,以维护 hashCode 方法的常规协定,该协定声明相等对象必须具有相等的哈希码。
判断对象是否相等的hashCode()方法
在HashSet中添加元素时,会判断添加的元素跟已经在HashSet中村中的hashCode是否相等,如果相等则不添加。
而默认的情况下,hashCode是使用对象地址生成的,如果要做特别的添加规则,可以重写这个方法。
如String类就重写了该方法,使得字符串相等时,hashCode也相等,String类的hashCode方法如下:
1 | public int hashCode() { |
这个方法返回此字符串的哈希码。String 对象的哈希码根据以下公式计算:
s[0]*31^(n-1) + s[1]*31^(n-2) + … + s[n-1]
使用 int 算法,这里 s[i] 是字符串的第 i 个字符,n 是字符串的长度,^ 表示求幂。(空字符串的哈希值为 0。)