Java面試 - == 和 equals 的區別?

==:若是比較的對象是基本數據類型,則比較的是數值是否一致;若是比較的是引用數據類型,則比較的是對象的地址值是否一致。
equals():equals()方法不能用於比較基本數據類型的對象,若是對象和自身進行比較,則equals()方法與==是同樣的。對於String類 Date類 File類等 可重寫equals() 方法用於比較對象的屬性內容是否一致。java

舉例
若是a,b 是基本類型,那麼== 運算符比較的是什麼呢?測試

public class Demo {
  private static int a = 100;
  private static int b = 100;
  public static void main(String[] args) {
    if(a == b){
      System.out.print("由於a,b是基本類型,因此此時比較的是a, b 的值");
    }
  }
}

運行Debug模式,測試一下
==運算符,比較基本數據類型的值.png
由此可知,當a,b是基本類型,那麼== 運算符比較的就是基本類型的值。
若是a,b 是引用類型, 那麼== 運算符比較的仍是a,b 的值嗎?this

public class Demo {

  private static String a = "china";
  private static String b = "china";

  public static void main(String[] args) {
    if(a == b){
      System.out.print("由於a, b是引用類型, 因此此時比較的是對象a, b的地址值");
    }
  }
}

運行Debug模式,測試一下
==運算符,比較引用數據類型的對象地址.png
由此可知,當a,b是引用類型,那麼== 運算符比較的就是引用類型的對象地址值。
若是a,b 是引用類型,那麼equals()方法比較的是什麼呢?3d

public class Demo {
  
  private static String a = "china";
  private static String b = "china";

  public static void main(String[] args) {
    if(a.equals(b)){
      System.out.print("由於a, b是引用類型, 因此此時比較的是對象a, b的地址值");
    }
  }
}

運行Debug模式,測試一下
equals()方法,比較引用數據類型的對象地址.png
由此可知,默認狀況下,equals()方法比較的是對象與自身是否一致。當對象與自身一致時,equals()方法與== 是同樣的。
若是重寫equals()方法,是否能夠比較對象的內容呢?code

class Pig {
  private String name;
  public void setName(String name){
    this.name = name;
  }
  public String getName(){
    return name;
  }
  //  重寫equals()方法, 用於比較對象的屬性內容是否一致
  public boolean equals(Object anObject) {
    // 判斷對象與自身是否一致
    if (this == anObject) {
      return true;
    }
   //  判斷anObject與String是否爲同類或存在繼承關係
    if (anObject instanceof String) {
        return true;
    }
    //判斷是同一類或者子父類關係,則將Object類型強轉爲Pig
    Pig pig = (Pig)anObject;
   // 比較pig的屬性name的內容是否一致
    if(this.name == pig.name && this.name.equals(pig.name)) {
      return true;
    }else {
      return false;
    }
  }
}

運行Debug模式,測試一下
重寫equals()方法,比較對象的屬性內容.png
由此可知,重寫equals()方法,equals()方法是能夠比較對象屬性內容是否一致的。對象

相關文章
相關標籤/搜索