Java equals() ,hashCode(),toString() 的推薦寫法。

一,equals()的推薦寫法

@Override 
public boolean equals(Object o) {
      // 1 相當(dāng)于hashcode相等,具有相同的散列數(shù)
      if (this == o) {
        return true;
      }
     // 2 如果另一個(gè)對(duì)象不是當(dāng)著的class類型,那必然是不相等的
      if (!(o instanceof MyType)) {
        return false;
      }

     // 3 判斷對(duì)象的私有成員是否相等。
     MyType lhs = (MyType) o;
     return primitiveField == lhs.primitiveField &&
            referenceField.equals(lhs.referenceField) &&
            (nullableField == null ? lhs.nullableField == null
                                  : nullableField.equals(lhs.nullableField));   }

二,hashCode()的推薦寫法

Override public int hashCode() {
     // 初始值為一個(gè)非零數(shù)
    int result = 17;

    // 為每個(gè)成員變量計(jì)算值
    result = 31 * result + (booleanField ? 1 : 0);
    result = 31 * result + byteField;
    result = 31 * result + charField;
    result = 31 * result + shortField;
    result = 31 * result + intField;
    result = 31 * result + (int) (longField ^ (longField >>> 32));
    result = 31 * result + Float.floatToIntBits(floatField);
    long doubleFieldBits = Double.doubleToLongBits(doubleField);
    result = 31 * result + (int) (doubleFieldBits ^ (doubleFieldBits >>> 32));
    result = 31 * result + Arrays.hashCode(arrayField);
    result = 31 * result + referenceField.hashCode();
    result = 31 * result + (nullableReferenceField == null ? 0
                                         : nullableReferenceField.hashCode());
    return result;
    }

知識(shí)拓展:
一,為什么經(jīng)常看到乘數(shù)為31?
1. 因?yàn)?1為素?cái)?shù)(只能被1和本身整除),在存儲(chǔ)數(shù)據(jù)計(jì)算hash地址時(shí),要盡量減少重復(fù)的hash值。所以在選擇系數(shù)的時(shí)候要選擇盡量長(zhǎng)的系數(shù)并且讓乘法盡量不要溢出的系數(shù),因?yàn)槿绻?jì)算出來的hash地址越大,所謂的“沖突”就越少,查找起來效率也會(huì)提高。
2. 31可以 由i*31== (i<<5)-1來表示,現(xiàn)在很多虛擬機(jī)里面都有做相關(guān)優(yōu)化,使用31的原因可能是為了更好的分配hash地址,并且31只占用5bits!
3.Java乘法中如果數(shù)字相乘過大會(huì)導(dǎo)致溢出的問題,從而導(dǎo)致數(shù)據(jù)的丟失.而31則是素?cái)?shù)(質(zhì)數(shù))而且不是很長(zhǎng)的數(shù)字

二,hashCode()的推薦寫法

Override public String toString() {
     return 
         getClass().getName() + "[" +
         "primitiveField=" + primitiveField + ", " +
         "referenceField=" + referenceField + ", " +
         "arrayField=" + Arrays.toString(arrayField) + "]";
  }
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容