3 回答

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

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

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