作者:三光937 | 来源:互联网 | 2023-05-17 01:08
转载请注明出处
http://blog.csdn.net/pony_maggie/article/details/43907633
作者:小马
先看一段代码:
class Value
{
int i;
}
public class Equivalence
{
/**
* @param args
*/
public static void main(String[] args)
{
// TODO Auto-generated method stub
Integer n1 = new Integer(47);
Integer n2 = new Integer(47);
System.out.println(n1 == n2);
System.out.println(n1.equals(n2));
Value v1 = new Value();
Value v2 = new Value();
v1.i = v2.i = 100;
System.out.println(v1.equals(v2));
}
}
输出的结果是
false
true
false
第一个false是因为 == 比较的是对象引用,n1和n2是两个不同的对象(尽管某个成员的值相等),所以结果是false。不过像这样的比较,大部分时候我们期望返回true,因为我们想比较的是47 == 47。那就只能用equals方法,所以第二个输出的是true。
第三个又是怎么一回事呢?事实上euqals是基类Object中的方法,它的缺省实现是比较两个对象的引用,Value类没有重写这个方法所以比较的结果还是false。Integer因为是内置的类,已经重写了equals方法。
又引出来一个问题,如何重写euqals方法呢?
class Value
{
int i;
public int hashCode()
{
return i;
}
public boolean equals(Object oo)
{
return (i == ((Value)oo).i);
}
}
注意到hashCode也重写了,在这里hashCode其实不是必须的。不过大部分情况下,如果你重新实现了euqals,都要重写hashCode,我们要保证equals相等的两个对象,它们的hashCode也要相等,所以要根据equals的实现规则重写hashCode。
另外,补充一点,Java语言对equals()的要求如下,这些要求是必须遵循的:
对称性:如果x.equals(y)返回是“true”,那么y.equals(x)也应该返回是“true”。
反射性:x.equals(x)必须返回是“true”。
类推性:如果x.equals(y)返回是“true”,而且y.equals(z)返回是“true”,那么z.equals(x)也应该返回是“true”。
还有一致性:如果x.equals(y)返回是“true”,只要x和y内容一直不变,不管你重复x.equals(y)多少次,返回都是“true”。