簡體   English   中英

為什么我們需要在java中重寫equals和hashcode,為什么我們不能使用Object類實現

[英]why we need to override equals and hashcode in java and why cannot we use Object class implementation

伙計們請讓我知道,在現實世界中我們為什么需要覆蓋equals和hashcode,並且我們不能使用Object的equals和hashcode。

Object的equals / hashcode實現很好 - 如果你想要“引用標識”作為你的相等。 換句話說,on對象將始終與其自身相等,但與另一個對象不同。

但是,如果您希望兩個不同的對象相等,則必須覆蓋該方法以說明它們應該如何相等(然后重寫哈希碼以使其與之一致)。

最簡單的例子可能是String。 具有相同字符的兩個不同字符串是相等的,並且它們相等非常有用

String x = new String(new char[]{'a', 'b', 'c'});
String y = new String(new char[]{'a', 'b', 'c'});
System.out.println(x.equals(y)); // Prints true

現在將它與FileInputStream進行比較 - 什么會使兩個FileInputStream相等? 如果他們正在閱讀同一個文件? 文件中的位置怎么樣? 兩個流到具有相同內容的不同文件怎么樣? IMO提出這個問題並沒有多大意義。

現在, Object實現如何知道FileInputStreamString的所需行為之間的區別? 可能會注意到添加到字段,屬性和類型本身的注釋,可能會自動生成適當的字節碼,然后可以進行JIT編譯......但當然Java在注釋可用之前很久就出現了。 當前的方法非常簡單 - 但它確實意味着如果您希望不同對象的值相等,則需要自己編寫代碼。

需要注意的一點是,對於不可變類型,通常更容易考慮相等性 - 如果兩個對象在一個時間點相等然后在之后不相等則會很奇怪。 這也可能嚴重搞亂哈希表 - 哈希碼基本上應該依賴於被認為是相等的對象的方面,並且當密鑰首次被添加到哈希表時記錄哈希碼; 如果您隨后更改了密鑰的內容,其哈希碼將會更改,但哈希表不會知道它。

因為在real world如果使用Object的實現

new Integer( 1 )不等於new Integer( 1 )

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM