equals()方法與“==”的區別
阿新 • • 發佈:2018-08-06
todo 不能 分別是 int bool print pre 分析 urn
首先我們來上手一段代碼:
public class Studnet { String name; public Studnet(String name){ this.name=name; } public static void main(String[] args) { Studnet studnet1=new Studnet("張三"); Studnet studnet2=new Studnet("張三"); System.out.println(studnet1==studnet2);//false System.out.println(studnet1.equals(studnet2));//false } }
在上面的這段代碼當中,我們創建了兩個student對象,分別student1和student2分別是兩個對象的引用。下面我們來對“==”和equals進行分析:
在“student1==student2”當中:是直接比較兩個對象的引用,我們不難判斷出,因為兩者指向的對象分別位於不同的存儲空間,所以student1和student2指向的地址也不一樣,故而student1與student2是永遠不相等的,如若比較兩個對象是否相等,是比較的是對象裏面的內容是否一致。總結如下:
要想判斷兩個對象是否相等,不能通過比較兩個對象的引用是否相等,這是永遠都得不到相等的結果的,因為兩個對象的引用永遠不會相等,所以正確的比較方法是直接比較這兩個對象,比較這兩個對象的實質是不是一樣的,即這兩個對象裏面的內容是不是相同的,通過比較這兩個對象的屬性值是否相同而決定這兩個對象是否相等。
因為默認的equals()方法裏面比較的是兩個引用是否指向同一對象,所以在上述代碼中,兩種比較實際是一樣的。解決辦法是在Student類裏面重寫equals()方法,代碼如下:
@Override public boolean equals(Object obj) { // TODO 自動生成的方法存根 if (obj==null) { return false; }else{ if (obj instanceof Studnet) { Studnet studnet=(Studnet) obj; if (((Studnet) obj).name==this.name) { return true; } } } return false; }
再執行上述代碼:
public class Studnet { String name; public Studnet(String name){ this.name=name; } public static void main(String[] args) { Studnet studnet1=new Studnet("張三"); Studnet studnet2=new Studnet("張三"); System.out.println(studnet1==studnet2);//false System.out.println(studnet1.equals(studnet2));//true } }
equals()方法與“==”的區別