Java 覆蓋equals時總要覆蓋hashcode_java

來源:互聯網
上載者:User

Java 覆蓋equals時總要覆蓋hashcode

          最近學習java 的基礎知識,碰到Java 覆蓋equals時總要覆蓋hashcode時候有許多疑問,經過和同事直接討論及上網查詢的資料,這裡整理下,也好協助大家理解,代碼中有說明。

具體實現代碼:

package cn.xf.cp.ch02.item9;import java.util.HashMap;import java.util.Map;public class PhoneNumber{  private final short areaCode;  private final short prefix;  private final short lineNumber;    public PhoneNumber(int areaCode, int prefix, int lineNumber)  {    rangeCheck(areaCode, 999, "area code");    rangeCheck(prefix, 999, "prefix");    rangeCheck(lineNumber, 9999, "line number");    this.areaCode = (short) areaCode;    this.prefix = (short) prefix;    this.lineNumber = (short) lineNumber;  }    private static void rangeCheck(int arg, int max, String name)  {    if (arg < 0 || arg > max)      throw new IllegalArgumentException(name + ": " + arg);  }    @Override  public boolean equals(Object o)  {    if (o == this)      return true;    if (!(o instanceof PhoneNumber))      return false;    PhoneNumber pn = (PhoneNumber) o;    return pn.lineNumber == lineNumber && pn.prefix == prefix && pn.areaCode == areaCode;  }    /*  @Override  //至於為什麼使用31,這個是推薦值,研究表明這個數字用起來效能比較好  public int hashCode()  {    int result = 17;    result = 31 * result + areaCode;    result = 31 * result + prefix;    result = 31 * result + lineNumber;    return result;  }  */    //如果一個對象不是經常變動,而且開銷比較大的話,就要考慮吧散列碼緩衝在對象內部  //用volatile修飾的變數,線程在每次使用變數的時候,都會讀取變數修改後的最的值。  private volatile int hashcode;    @Override  public int hashCode()  {    int result = hashcode;    if (result == 0)    {      result = 17;      result = 31 * result + areaCode;      result = 31 * result + prefix;      result = 31 * result + lineNumber;      hashcode = result;    }        return result;  }    public static void main(String[] args)  {    Map<PhoneNumber, String> m = new HashMap<PhoneNumber, String>();    m.put(new PhoneNumber(707, 867, 5309), "Jenny");    //這裡不會返回jenny哦,會返回null,這個是因為put對象吧他們放到不同的散列桶中    System.out.println(m.get(new PhoneNumber(707, 867, 5309)));  }}

感謝閱讀,希望能協助到大家,謝謝大家對本站的支援!

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.