论坛首页 入门技术论坛

hashCode()与equals()

浏览 1058 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2012-06-07  
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方法如下:
public int hashCode() {
int h = hash;
int len = count;
if (h == 0 && len > 0) {
int off = offset;
char val[] = value;

for (int i = 0; i < len; i++) {
h = 31*h + val[off++];
}
hash = h;
}
return h;
}
这个方法返回此字符串的哈希码。String 对象的哈希码根据以下公式计算:
s[0]*31^(n-1) + s[1]*31^(n-2) + … + s[n-1]
使用 int 算法,这里 s[i] 是字符串的第 i 个字符,n 是字符串的长度,^ 表示求幂。(空字符串的哈希值为 0。)
论坛首页 入门技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics