爲什麼Collection接口有equals(Object o)
和hashCode()
,因爲任何實現都會默認使用這些接口(從Object
繼承)?爲什麼Collection接口有equals()和hashCode()?
回答
雖然 的
Collection
接口增加了不規定合同 一般爲Object.equals
,誰落實Collection
接口「直接」(即程序員,創建一個類,是Collection
但不是Set
或List
)必須小心,如果他們 選擇覆蓋Object.equals
。沒有必要這樣做, ,最簡單的方法是依靠Object的 實現,但實現者可能希望實現「值 比較」來代替默認的「參考比較」。 (該List
和Set
接口任務這樣的值的比較。)爲等於 必須是對稱的
Object.equals
方法狀態的一般合同(換句話說,a.equals(b)
當且僅當b.equals(a)
)。List.equals
和Set.equals
的合同規定 列表僅與其他列表相同,並設置爲其他集合。因此,對於既不實現List
也不實現Set
接口的集合類的自定義等於方法必須返回false,此集合是 與任何列表或集合相比較。 (通過相同的邏輯,這是不可能的 編寫正確的同時實現Set和List 接口的類。)
和
雖然Collection接口沒有增加規定向一般
Object.hashCode
方法的合同,程序員應該注意,任何覆蓋Object.equals
方法的類都必須覆蓋Object.hashCode
方法,以滿足Object.hashCode
方法的一般合同。特別是,c1.equals(c2)
意味着c1.hashCode()==c2.hashCode()
。
要回答你的具體問題:爲什麼它有這些方法?這只是爲了方便起見,可以包含Java Docs,提供關於實現者應該如何處理這些方法的提示(例如比較值的相等而不是引用)。
當任何類實現接口時,它會注入/接受由接口定義的合約/規則。
Equalable & Hashable是兩個默認提供的合同/規則。通過這樣做假設給定類的equals和hashCode對該類是正確實現的。
- 1. toString,hashcode和equals方法內部接口
- 2. 什麼是重寫equals()和hashCode()的POJO?
- 3. Overrding equals和hashCode
- 4. Map HashCode和Equals
- 5. contains()的Collection框架不使用hashcode,而是使用equals(),爲什麼?
- 6. 這個聲明對重寫hashcode和equals有什麼意義?
- 7. Java equals()和hashCode()的變化
- 8. Google App Engine,JDO和equals/hashCode
- 9. 面試之謎 - 爲什麼我們要重寫了hashCode和equals方法
- 10. 爲什麼Map不能擴展Collection接口
- 11. 如何實現hashCode和equals方法
- 12. 忽略equals()和hashCode()在Java中
- 13. 重寫的hashCode()和equals()方法
- 14. SCJP hashCode()和equals()方法混淆
- 15. 在Eclipse中調試equals()和hashCode()
- 16. 爲什麼[WCF]有接口
- 17. 所有類都應該有.equals和.hashcode方法嗎?
- 18. 爲什麼沒有Stream.flatMap(Collection)方法?
- 19. 如果有什麼的Equals爲NaN
- 20. 爲什麼AbstractCollection沒有實現equals()?
- 21. 當superclass不重新聲明equals()和hashCode()時會出現什麼問題?
- 22. 爲什麼對象不相同添加有相同的值,HashSet的,甚至的hashCode和equals被覆寫
- 23. 使用自然鍵作爲equals和hashCode的一部分
- 24. 我創建equals()和hashCode()是沒有做任何事情
- 25. Linq:在連接中==和equals有什麼區別?
- 26. 實現java Collection接口的正確方法是什麼
- 27. Clojure:爲什麼=和.equals字符串有不同的表現?
- 28. 爲什麼沒有SqlDataReader.ReadAsync()的接口
- 29. 我的@implementation中有@接口 - 爲什麼?
- 30. 爲什麼Java中沒有「Equlable」接口?