一,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) + "]";
}