深入equals方法對象相等比較

來源:互聯網
上載者:User

equals方法的重要性毋須多言,只要你想比較的兩個對象不願是同一對象,你就應該實現equals方法,讓對象用你認為相等的條件來進行比較.下面的內容只是API的規範,沒有什麼太高深的意義,但我之所以最先把它列在這兒,是因為這些規範在事實中並不是真正能保證得到實現.

1.對於任何參考型別, o.equals(o)==true 成立.

2.如果 o.equals(o1)==true 成立,那麼o1.equals(o)==true也一定要成立.

3.如果 o.equals(o1)==true 成立且o.equals(o2)==true 成立,那麼o1.equals(o2)==true 也成立.

4.如果第一次調用o.equals(o1)==true 成立再o和o1沒有改變的情況下以後的任何次調用都成立.

5.o.equals(null)==true 任何時間都不成立.

以上幾條規則並不是最完整的表述,詳細的請參見API文檔.對於Object類,它提供了一個最最嚴密的實現,那就是只有是同一對象是,equals方法才返回true,也就是人們常說的引用比較而不是值比較.這個實現嚴密得已經沒有什麼實際的意義,所以在具體子類(相對於Object來說)中,如果我們要進行對象的值比較,就必須實現自己的equals方法.

先來看一下以下這段程式:

public boolean equals(Object obj)
  {
    if (obj == null) return false;
    if (!(obj instanceof FieldPosition))
      return false;
    FieldPosition other = (FieldPosition) obj;
    if (attribute == null) {
      if (other.attribute != null) {
        return false;
      }
    }
    else if (!attribute.equals(other.attribute)) {
      return false;
    }
    return (beginIndex == other.beginIndex
      && endIndex == other.endIndex
      && field == other.field);
  }

這是JDK中java.text.FieldPosition的標準實現,似乎沒有什麼可說的.我信相大多數或絕大多數程式員認為,這是正確的合法的equals實現.畢竟它是JDK的API實現啊.還是讓我們以事實來說話吧:

package debug;
import java.text.*;
public class Test {
 public static void main(String[] args) {
  FieldPosition fp = new FieldPosition(10);
  FieldPosition fp1 = new MyTest(10);
  System.out.println(fp.equals(fp1));
  System.out.println(fp1.equals(fp));
 }
}
class MyTest extends FieldPosition{
 int x = 10;
 public MyTest(int x){
  super(x);
  this.x = x;
 }
 public boolean equals(Object o){
  if(o==null) return false;
  if(!(o instanceof MyTest )) return false;
  return ((MyTest)o).x == this.x;
 }
}

運行一下看看會列印出什麼:

System.out.println(fp.equals(fp1));列印true

System.out.println(fp1.equals(fp));列印flase

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.