3 回答

TA貢獻1757條經驗 獲得超7個贊
好吧,hashCode()
總是返回內存地址并不完全正確。在您的特定情況下,您正在覆蓋該函數以基本上返回Subject
引用的 hashCode。
您的評估顯示以下輸出:
stringops.Student@955a0720
這可能有點令人困惑,因為這實際上不是裸內存地址,而是對toString()
對象方法的調用。
看看Java是如何實現的 toString
:
getClass().getName() + '@' + Integer.toHexString(hashCode())
所以,事實上,這兩個對象有不同的內存位置,但是因為你覆蓋hashCode()
你不會看到它們。此外,沒有辦法覆蓋 Java 如何選擇對象的內存地址(可能除了一些 hack),但是,兩個對象不能具有相同的地址。
下次請包含更多文本而不是屏幕截圖,以提高其他人對您的問題的搜索能力。

TA貢獻1780條經驗 獲得超4個贊
您剛剛正確地確定了兩個不同的對象——即不在同一內存地址的兩個對象——確實可以具有相同的哈希碼。規則是,如果兩個對象通過該.equals()
方法相等,那么它們應該產生相同的哈希碼。除了這個和“不同的對象應該嘗試有不同的哈希碼”的一般想法之外,沒有要求不同位置的對象應該有不同的哈希值。
不過,這是一件好事。例如,String
每個具有相同字符序列的兩個不同對象應該直觀地具有相同的哈希碼,以便HashMap<String, T>
可以正確查找字符串。這樣,提供與String
用作鍵的對象不同但具有相同邏輯值的對象將正常工作;所有String
具有相同字符序列的 s 散列到同一個位置。

TA貢獻1752條經驗 獲得超4個贊
hashcode 是一個 int 值,由 hascode() 方法返回。
Object.java 定義了 hascode() 并且每個 java 類都是 Object.java 的子類,因此每個類都繼承它。
如果他/她希望覆蓋它,則取決于特定類的開發人員。類的開發人員可能會選擇(盡管是一種不好的做法)為類的所有對象重新運行相同的常量 int 值。
通常 hascode 取決于對象的一個或多個屬性的值。即使開發人員可能會盡力返回唯一的哈希碼,但仍然(哈希碼沖突)兩個不同的對象最終可能會得到相同的哈希碼。
一次只能將一個內存位置分配給一個對象。
兩個不同對象的哈希碼(位于內存中的兩個不同地址)可能相同也可能不同
還有一個相關的概念:equals 和 hascode 方法的合同。它表示如果兩個對象通過調用 equals 返回 true,則兩個對象必須具有相同的哈希碼。請注意,這是定義的合同,但由開發人員開發類并編寫哈希碼方法以遵守合同。一個糟糕的實現可能會導致兩個對象返回不同的hascode,對于equals方法返回true。
添加回答
舉報