1. 程式人生 > >equals()方法與“==”的區別

equals()方法與“==”的區別

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()方法與“==”的區別