先看一段String 和 一个普通类的equals方法的比较
/**
* Object 中的equlas的使用
* @author dell
*
*/
public class TestEquals {
public static void main(String [] args){
/** ================== String中有重写的equals===========================*/
String str1 = new String("123");
String str2 = new String("123");
System.out.println(str1.equals(str2)); //out:true
System.out.println(str1.equals(str1)); //out:true
/**==================== Dog中没有重写equals ========================= */
//dog1 与 dog2 的变量值相同
Dog dog1 = new Dog("dog");
Dog dog2 = new Dog("dog");
System.out.println(dog1.equals(dog2)); //out:false
//dog1与dog2的变量引用相同
dog1.name = dog2.name;
System.out.println(dog1.equals(dog2)); //out:false
//dog1与dog2的引用相同
dog1 = dog2;
System.out.println(dog1.equals(dog2)); //out:true
/**==================== Cat中重写equals,比较Cat中name属性 ========================= */
Cat cat1 = new Cat("cat");
Cat cat2 = new Cat("cat");
System.out.println(cat1.equals(cat2)); //out:true
}
}
/**
* Dog 中的没有equals方法的重写
* @author dell
*
*/
public class Dog {
String name;
public Dog(String name){
this.name = name;
}
}
/**
* Cat 重写了equals方法
* @author dell
*
*/
public class Cat {
String name;
public Cat(String name){
this.name = name;
}
@Override
public boolean equals(Object anoObject) {
if (this == anoObject) { // 如果两个对象的引用相同
return true;
}
if (anoObject instanceof Cat) {
Cat anoCat = (Cat) anoObject;
if(this.name.equals(anoCat.name)){
return true;
}
}
return false;
}
}
str1和str2的值相等,String的equals在字符串中比较的是对象的值,不是引用,和==有区别,这里不做解释
第一个输出是true,equals比较String对象中的值,两个都是"123",所以输出true
同样的写法,为什么输出比较两个dog的时候输出却是false
Dog是Object 的子类,String也是Object的子类,区别在于String中重写了Object中的equals方法
下面附上String和Object 的源码
/**
* String 的equals方法
*/
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String anotherString = (String)anObject;
int n = count;
if (n == anotherString.count) {
char v1[] = value;
char v2[] = anotherString.value;
int i = offset;
int j = anotherString.offset;
while (n-- != 0) {
if (v1[i++] != v2[j++])
return false;
}
return true;
}
}
return false;
}
/**
* Obejct中的equals方法
*/
public boolean equals(Object obj) {
return (this == obj);
}
String的equals方法中先是判断两个对象的引用是否相同,在判断字符串的长度是否相同,然后判断每个字符串相同...
而Object中的equals只判断对象的引用是否相同,如果引用不同直接返回false
所以说当dog1对象使用equals方法时候调用的Object 中的equals方法,判断的是dog1和dog2的引用是否相等
当然不相等,所以输出false
再看Cat类,Cat类中实现了对Object 方法的重写,判断Cat中的name属性的值是否相等。而不是判断两个cat对象的引用是否相等
所以输出true