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...