重寫equals和hashcode的實踐

2021-09-11 19:39:51 字數 2860 閱讀 9908

object類裡面有預設的equals和hashcode方法,equals是比較兩個物件的記憶體引用是不是乙個位址,是則預設為同乙個物件,hashcode則是用用了jdk內建的本地方法(c語言實現)計算得出。

這次在專案中,需要用到比較兩個物件,我是想兩個物件裡面的字段值一致則表示它們相等。因此需要重寫這兩個方法。

千萬注意!!如果重寫了equals方法,那麼hashcode方法也一定要相等。

因為要滿足乙個約定,就是兩個物件相等,那麼它們的hashcode也必定相等!!!

static class inoviceinfo 

/*** 關聯藍字發票號碼

*/private string relevancenum;

/*** 關聯藍字***碼

如果不重寫hashcode 那麼會發現,放到map中的值,再用key去取,取不到!!

static class inoviceinfo 

/*** 關聯藍字發票號碼

*/private string relevancenum;

/*** 關聯藍字***碼

重寫之後,會發現,infomap.put(new inoviceinfo("a", "b"), "1");放進去的1在後面被取出來了!

hashcode 需要保證,不相等的物件hashcode不同,相同的物件則相同!!

***************==

以上**經過驗證是有bug的

這個demo中的例子,之所以會相等,因為

infomap.put(new inoviceinfo(「a」, 「b」), 「1」);

system.out.println(infomap.get(new inoviceinfo(「b」, 「a」)));

這兩個地方的a和b 被存入了字串常量池,所以用== 比較時候才會是true

if (this.relevancecode == that.relevancecode && this.relevancenum == that.relevancenum)

換個例子就失效了

比如說:

在實際使用中,不可能每次都運氣那麼好,可以遇到在常量池中的?️!

合理的equals寫法如下

重寫equals為啥需要重寫hashCode

以前一直記得重寫equals要把hashcode也要重寫了,但是一直也是沒有搞明白,最近在看一些東西,覺得有必要記錄一下。equals是object類的方法,這個方法的作用是比較兩個物件是否相等的,可能有人會問了,使用 號不就可以比較了,為啥非得使用equals方法呢。假設你有乙個student類,...

重寫equals時還必須重寫hashCode方法

1.public boolean equals object obj 和 hashcode 方法是object物件中的方法 2.equals 與 hashcode間的關係是這樣的 a.如果兩個物件相同 即用equals比較返回true,那麼它們的 hashcode 值一定要相同 b.如果兩個物件的 ...

如何正確的覆蓋equals和hashCode

public boolean equals object obj public native int hashcode public string tostring protected native object clone throws clonenotsupportedexception pro...