[英]Hashcode contract in java?
只要在Java應用程序執行期間在同一對象上多次調用它,hashCode方法就必須一致地返回相同的整數,前提是不修改該對象的equals比較中使用的信息。
以上聲明是根據哈希碼合同寫在http://download.oracle.com/javase/6/docs/api/java/lang/Object.html#hashCode ()上的。
我有一個關於陳述的問題,即
如果沒有修改對象的等值比較中使用的信息
即使我們修改equals方法,哈希碼也將返回相同的整數。 因此,哈希碼的值取決於對象是否相等。
好問題。 從equals()文檔中 ,
請注意,通常有必要在重寫此方法時重寫hashCode方法,以維護hashCode方法的常規協定,該協定規定相等的對象必須具有相等的哈希碼。
這意味着,如果沒有任何一個對象屬性(請參見:不應被視為瞬態的實例變量)被修改,那么equals應該給出相同的結果,並且hashcode應當相應地表現(對於該對象而言是相同的)。
實際示例:
class Pair {
public int x, y;
public int hashCode(); // computes hashcode based on both x and y
}
Pair p = new Pair(3,10);
int h1 = p.hashCode();
// program does something but pair is still (3,10)
int h2 = p.hashCode();
assert(h1 == h2)
原理是,如果equals
比較結果更改,則哈希代碼必須更改,反之亦然。 這通常意味着在計算哈希碼時應考慮比較兩個項目時考慮的所有變量 ,這樣,如果發生某些更改,則此更改將同時反映在比較和哈希碼上。
您正在為不存在的語句添加額外的含義。 它並沒有說,如果等於的值更改,hashCode 將會更改。 就是說,如果等於的值更改,則hashCode 可能會更改。 不再保證hashCode之后將相同。 如果還是這樣,那是沒有錯的!
記得
@Override
public int hashCode() {
return 1;
}
是滿足文檔規定的所有要求的hashCode()的完全合法實現。 根據定義,hashCode不依賴於equals計算。
實際上,它們當然將耦合在一起。 通常,您使用等於等號中使用的所有相同字段來覆蓋哈希碼,因為必須使兩個等於true的不同對象具有相同的hashCode。 並返回1; 在實際上依賴hashCode()方法的任何類中都不能很好地發揮作用。
hashCode合法實現的這種形式更完整的示例有時會在等於更改時更改,但並非總是如此,可能會更清楚。
public class MakesHashMapsSlow {
private String value;
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
@Override
public boolean equals(Object obj) {
if (obj == null) {
return false;
}
if (getClass() != obj.getClass()) {
return false;
}
final MakesHashMapsSlow other = (MakesHashMapsSlow) obj;
if ((this.value == null) ? (other.value != null) : !this.value.equals(other.value)) {
return false;
}
return true;
}
@Override
public int hashCode() {
if (value == null || value.isEmpty()) {
return 0;
} else {
return value.charAt(0);
}
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.