equals()和==區別

好久沒用java了,學的時候就沒有很認真,現在發現java很多基本的東西都不會了.今天突然遇到equals()和==比較的區別,就感到暈,於是google了以下,當看到下面這樣的解釋時感到茅塞頓開,就極力推薦一下.

equals 方法(是String類從它的超類Object中繼承的)被用來檢測兩個對象是否相等,即兩個對象的內容是否相等。
==用於比較引用和比較基本數據類型時具有不同的功能:
比較基本數據類型,如果兩個值相同,則結果爲true
而在比較引用時,如果引用指向內存中的同一對象,結果爲true

這是從Think in java 中找的

1. 檢查對象是否相等
關係運算符==和!=也適用於所有對象,但它們的含義通常會使初涉Java領域的人找不到北。下面是一個例子:


//: Equivalence.java

public class Equivalence {
  public static void main(String[] args) {
    Integer n1 = new Integer(47);
    Integer n2 = new Integer(47);
    System.out.println(n1 == n2);
    System.out.println(n1 != n2);
  }
} ///:~

其中,表達式System.out.println(n1 == n2)可打印出內部的布爾比較結果。一般人都會認爲輸出結果肯定先是true,再是false,因爲兩個Integer對象都是相同的。但儘管對象的內容相同,句柄卻是不同的,而==和!=比較的正好就是對象句柄。所以輸出結果實際上先是false,再是true。這自然會使第一次接觸的人感到驚奇。
若想對比兩個對象的實際內容是否相同,又該如何操作呢?此時,必須使用所有對象都適用的特殊方法equals()。但這個方法不適用於“主類型”,那些類型直接使用==和!=即可。下面舉例說明如何使用:


//: EqualsMethod.java

public class EqualsMethod {
  public static void main(String[] args) {
    Integer n1 = new Integer(47);
    Integer n2 = new Integer(47);
    System.out.println(n1.equals(n2));
  }
} ///:~

正如我們預計的那樣,此時得到的結果是true。但事情並未到此結束!假設您創建了自己的類,就象下面這樣:


//: EqualsMethod2.java

class Value {
  int i;
}

public class EqualsMethod2 {
  public static void main(String[] args) {
    Value v1 = new Value();
    Value v2 = new Value();
    v1.i = v2.i = 100;
    System.out.println(v1.equals(v2));
  }
} ///:~

此時的結果又變回了false!這是由於equals()的默認行爲是比較句柄。所以除非在自己的新類中改變了equals(),否則不可能表現出我們希望的行爲。不幸的是,要到第7章纔會學習如何改變行爲。但要注意equals()的這種行爲方式同時或許能夠避免一些“災難”性的事件。
大多數Java類庫都實現了equals(),所以它實際比較的是對象的內容,而非它們的句柄。

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