equals()和hashcode()这两个方法都是从object类中继承过来的。
equals()方法在object类中定义如下:
public boolean equals(Object obj) {
return (this == obj);
}
是对两个对象的地址值进行的比较(即比较引用是否相同)。但是我们必需清楚,当String 、Math、还有Integer、Double。。。。等这些封装类在使用equals()方法时,已经覆盖了object类的equals()方法。比如在String类中如下:
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String anotherString = (String) anObject;
int n = value.length;
if (n == anotherString.value.length) {
char v1[] = value;
char v2[] = anotherString.value;
int i = 0;
while (n-- != 0) {
if (v1[i] != v2[i])
return false;
i++;
}
return true;
}
}
return false;
}
这是在进行的内容比较,而已经不再是地址的比较。依次类推Double、Integer、Math等等这些类都是重写了equals()方法的,从而进行的是内容的比较。
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”。
• 任何情况下,x.equals(null),永远返回是“false”;x.equals(和x不同类型的对象)永远返回是“false”。
以上这五点是重写equals()方法时,必须遵守的准则,如果违反会出现意想不到的结果
hashcode() 方法在object类中定义如下:
public native int hashCode();
说明是一个本地方法,它的实现是根据本地机器相关的。当然我们可以在自己写的类中覆盖hashcode()方法,比如String、Integer、Double等等这些类都是覆盖了hashcode()方法的。下面是String类中hashcode方法:
public int hashCode() {
int h = hash;
if (h == 0 && value.length > 0) {
char val[] = value;
for (int i = 0; i < value.length; i++) {
h = 31 * h + val[i];
}
hash = h;
}
return h;
}
测试:
String str1=new String("abc");
String str2=new String("abc");
String str3="abc";
String str4="abc";
System.out.println(str1.equals(str2));//true
System.out.println(str1==str2);//false
System.out.println(str1.hashCode());
System.out.println(str2.hashCode());
System.out.println(str1.hashCode()==str2.hashCode());//true
System.out.println("===============================");
System.out.println(str3.equals(str4));//true
System.out.println(str3==str4);//true
System.out.println(str3.hashCode());
System.out.println(str4.hashCode());
System.out.println(str3.hashCode()==str4.hashCode());//true
System.out.println("===============================");
Object obj1=new Object();
Object obj2=new Object();
System.out.println(obj1.equals(obj2));//false
System.out.println(obj1==obj2);//false
System.out.println(obj1.hashCode());
System.out.println(obj2.hashCode());
System.out.println(obj1.hashCode()==obj2.hashCode());//false
原文:http://blog.csdn.net/winer2008/article/details/4059789