初學java可能老師都講過==與 String 中equals的比較
public class DemoTest {
public static void main(String[] args) {
String str1="123";
String str2="123";
System.out.println("str1==str2 ? "+(str1==str2));
String str3=new String("123");
String str4=new String("123");
System.out.println("str3==str4 ? "+(str3==str4));
System.out.println("str3==str4 ? "+str3.equals(str4));
}
}
結果:
因此很多人認爲:== 比較的是地址 equals 比較的是內容 這其實是一種誤解!
看如下代碼:
class Person{
String id;
public Person(String id){
this.id=id;
}
}
public class DemoTest {
public static void main(String[] args) {
Person p1=new Person("123");
Person p2=new Person("123");
System.out.println("p1==p2 ? "+(p1==p2));
System.out.println("p1==p2 ? "+p1.equals(p2));
}
}
結果:
假如==比較的是地址,equals比較的是內容爲什麼上面的代碼p1.equals(p2),會等於false呢?
其實在java中:
默認情況下Object中equals與==都是比較的地址,但是String類中的equals覆寫Object中的equals,所以在String中,equals比較的是內容,但是在自定義類中卻沒有覆寫Object中的equals。因此比較的是地址。所以如果比較自定義類中的對象是否相同,也需要覆寫Object中的equals方法來重新定義equals
代碼如下:
class Person{
String id;
public Person(String id){
this.id=id;
}
/**覆寫equals方法*/
public boolean equals(Person a){
//1.首先盤段兩個對象需要比較的Object是否爲null,如果是返回false
if(a==null){
return false;
}
//2.判斷測試的是否爲同一個對象,如果是返回true
if(this == a){
return true;
}
//3.判斷他們的類型是否相等,如果不相等,返回false
if(this.getClass() != a.getClass()){
return false;
}
//4.判斷值是否相等
//此處equals因爲比較的是字符串,所以比較的是內容
return id.equals(a.id);
}
}
public class DemoTest {
public static void main(String[] args) {
Person p1=new Person("123");
Person p2=new Person("123");
System.out.println("p1==p2 ? "+(p1==p2));
System.out.println("p1==p2 ? "+p1.equals(p2));
}
}
結果: