java中==與 String中 equals 和對象中equals比較

初學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));
	}
}

結果:





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章