Object 和 String 的equals比较

时间:2021-04-07 16:05:32

先看一段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