Object
在Java中有hashCode
方法,但是,它僅用於關聯容器,如HashSet
或HashMap
。爲什麼它是這樣設計的? Hashable
接口有hashCode
方法看起來更加優雅的解決方案。爲什麼在Java中沒有Hashable接口
回答
這個問題與另一個問題是重複的,它詢問爲什麼沒有像Comparator
(與Comparable
不同)但是用於哈希的接口。 .NET包含這樣一個接口,稱爲IEqualityComparer
,它看起來也可以像Java一樣。事實上,如果有人想要例如有一個Java集合,例如以不區分大小寫的方式將字符串映射到其他對象(可能是IEqualityComparer
的最常見用法),必須將字符串包裝在對象中,而對象的方法不區分大小寫。
我懷疑大問題是,雖然「equalityComparer」接口可能很方便,但在許多情況下,高效地測試等價關係需要緩存信息。例如,儘管不區分大小寫的字符串散列函數可以使傳入的字符串只有大寫字母的副本並對其調用hashCode
,但要避免每次請求特定字符串的散列碼都要重複轉換大寫和大寫值的散列。相比之下,「不區分大小寫的字符串」對象可以包含字符串的大寫字母副本的字段,然後只需爲該實例生成一次即可。
的EqualityComparer
能夠實現合理的性能,如果它包含的東西像一個WeakHashMap<string,string>
轉換原始字符串爲大寫,只有字符串,但這樣的設計要麼需要不同的線程儘管缺乏外部可見的狀態來使用不同的EqualityComparer
的情況下,或否則,即使在單線程場景中,也需要性能搶奪鎖定和同步代碼。
順便說一句,比較器式接口產生的第二個問題是使用外部提供的比較器(不管它是比較排名還是相等)的集合類型是比較器本身成爲類的狀態的一部分它使用它。如果散列表使用不同的EqualityComparer實例,則可能無法知道它們可以安全地視爲等同,即使兩個比較器在所有情況下的行爲都是相同的。
有什麼好處,它有一個接口,每個對象實現無論如何通過繼承?由於Object
實現它並且應該是可散列的,因此它的聲明中必須有implements Hashable
,並且所有其他類將繼承它,因爲它們是Object
的子類。有一個接口Hashable
只是說明顯而易見的。
根據同樣的想法,我們可以問,有什麼好處,有兩種方法,每個對象都有,但從來沒有使用過?而當他們最終只使用一種方法而不是使用調用者代碼的方式使用時就會失敗。那麼這個設計決定有什麼合理性? –
- 1. 爲什麼Java中沒有「Equlable」接口?
- 2. 爲什麼在java中需要接口?
- 3. 爲什麼Java接口
- 4. RandomAccess接口,爲什麼沒有方法?
- 5. 爲什麼沒有SqlDataReader.ReadAsync()的接口
- 6. 爲什麼沒有在Java中
- 7. 爲什麼LinkedList在java中沒有initialCapacity?
- 8. 爲什麼在java中沒有sizeof
- 9. 爲什麼[WCF]有接口
- 10. 爲什麼在Microsoft.Fakes中沒有接口的存根存根
- 11. 爲什麼在子類中的接口沒有發佈
- 12. 爲什麼Java沒有宏?
- 13. 我的@implementation中有@接口 - 爲什麼?
- 14. 爲什麼Java標準庫中沒有堆棧集合類型的接口?
- 15. Java此接口有什麼問題
- 16. 爲什麼我們需要java中的私有嵌套接口?
- 17. 迭代器接口中爲什麼沒有添加方法
- 18. 爲什麼java中沒有頭文件?
- 19. 爲什麼Java中沒有靜態類
- 20. Swift 3中Any,Hashable,AnyHashable之間有什麼區別?
- 21. Java:沒有接口實現?
- 22. 爲什麼#clone()不在Cloneable接口中?
- 23. 爲什麼接口變量在Java中是隱式靜態的?
- 24. 爲什麼我應該在Java中使用這種接口?
- 25. 爲什麼在Java Stream接口中重載()的varargs方法?
- 26. 爲什麼沒有訪問端口0xCF8?
- 27. 爲什麼WPF窗口沒有打開
- 28. 什麼是java中的靜態接口?
- 29. 什麼是Java中的接口?
- 30. 什麼是Java中的回調接口?
爲什麼你需要特殊的接口,當你可以覆蓋它的每一個地方,Object是默認的超類? – kosa
@Namban問題更多的是「爲什麼每個對象都有一個hashCode()方法,當它只被少數java.util。*集合類使用時」。即爲什麼不存在例如一個ObjectHash接口,就像有一個Comparable接口一樣,等等。 – nos
這是一個討論主題而不是問題,所以它不適合SO。 – Keppil