3 回答
TA貢獻(xiàn)1757條經(jīng)驗(yàn) 獲得超7個(gè)贊
好吧,hashCode()總是返回內(nèi)存地址并不完全正確。在您的特定情況下,您正在覆蓋該函數(shù)以基本上返回Subject引用的 hashCode。
您的評(píng)估顯示以下輸出:
stringops.Student@955a0720
這可能有點(diǎn)令人困惑,因?yàn)檫@實(shí)際上不是裸內(nèi)存地址,而是對(duì)toString()對(duì)象方法的調(diào)用。
看看Java是如何實(shí)現(xiàn)的 toString:
getClass().getName() + '@' + Integer.toHexString(hashCode())
所以,事實(shí)上,這兩個(gè)對(duì)象有不同的內(nèi)存位置,但是因?yàn)槟愀采whashCode()你不會(huì)看到它們。此外,沒(méi)有辦法覆蓋 Java 如何選擇對(duì)象的內(nèi)存地址(可能除了一些 hack),但是,兩個(gè)對(duì)象不能具有相同的地址。
下次請(qǐng)包含更多文本而不是屏幕截圖,以提高其他人對(duì)您的問(wèn)題的搜索能力。
TA貢獻(xiàn)1780條經(jīng)驗(yàn) 獲得超4個(gè)贊
您剛剛正確地確定了兩個(gè)不同的對(duì)象——即不在同一內(nèi)存地址的兩個(gè)對(duì)象——確實(shí)可以具有相同的哈希碼。規(guī)則是,如果兩個(gè)對(duì)象通過(guò)該.equals()方法相等,那么它們應(yīng)該產(chǎn)生相同的哈希碼。除了這個(gè)和“不同的對(duì)象應(yīng)該嘗試有不同的哈希碼”的一般想法之外,沒(méi)有要求不同位置的對(duì)象應(yīng)該有不同的哈希值。
不過(guò),這是一件好事。例如,String每個(gè)具有相同字符序列的兩個(gè)不同對(duì)象應(yīng)該直觀地具有相同的哈希碼,以便HashMap<String, T>可以正確查找字符串。這樣,提供與String用作鍵的對(duì)象不同但具有相同邏輯值的對(duì)象將正常工作;所有String具有相同字符序列的 s 散列到同一個(gè)位置。
TA貢獻(xiàn)1752條經(jīng)驗(yàn) 獲得超4個(gè)贊
hashcode 是一個(gè) int 值,由 hascode() 方法返回。
Object.java 定義了 hascode() 并且每個(gè) java 類(lèi)都是 Object.java 的子類(lèi),因此每個(gè)類(lèi)都繼承它。
如果他/她希望覆蓋它,則取決于特定類(lèi)的開(kāi)發(fā)人員。類(lèi)的開(kāi)發(fā)人員可能會(huì)選擇(盡管是一種不好的做法)為類(lèi)的所有對(duì)象重新運(yùn)行相同的常量 int 值。
通常 hascode 取決于對(duì)象的一個(gè)或多個(gè)屬性的值。即使開(kāi)發(fā)人員可能會(huì)盡力返回唯一的哈希碼,但仍然(哈希碼沖突)兩個(gè)不同的對(duì)象最終可能會(huì)得到相同的哈希碼。
一次只能將一個(gè)內(nèi)存位置分配給一個(gè)對(duì)象。
兩個(gè)不同對(duì)象的哈希碼(位于內(nèi)存中的兩個(gè)不同地址)可能相同也可能不同
還有一個(gè)相關(guān)的概念:equals 和 hascode 方法的合同。它表示如果兩個(gè)對(duì)象通過(guò)調(diào)用 equals 返回 true,則兩個(gè)對(duì)象必須具有相同的哈希碼。請(qǐng)注意,這是定義的合同,但由開(kāi)發(fā)人員開(kāi)發(fā)類(lèi)并編寫(xiě)哈希碼方法以遵守合同。一個(gè)糟糕的實(shí)現(xiàn)可能會(huì)導(dǎo)致兩個(gè)對(duì)象返回不同的hascode,對(duì)于equals方法返回true。
添加回答
舉報(bào)
