[英]Hashtable get() operation not working as per documentation
根據Java Hashtable類的官方文檔( https://docs.oracle.com/javase/7/docs/api/java/util/Hashtable.html ),get()操作將返回其記錄值之一,如果所述值具有一個將參數饋入該鍵的equals()操作時返回true的鍵。
因此,理論上,以下代碼應返回“ Hello!”。 對於兩個Hashtable的get()查詢:
public static class Coordinates implements Serializable {
private int ex;
private int why;
public Coordinates(int xCo, int yCo) {
ex = xCo;
why = yCo;
}
public final int x() {
return ex;
}
public final int y() {
return why;
}
public boolean equals(Object o) {
if(o == null) {
return false;
} else if(o instanceof Coordinates) {
Coordinates c = (Coordinates) o;
return this.x() == c.x() && this.y() == c.y();
} else {
return false;
}
}
}
Hashtable<Coordinates, String> testTable = new Hashtable<Coordinates, String>();
Coordinates testKey = new Coordinates(3, 1);
testTable.put(testKey, "Hello!");
testTable.get(testKey); //This will return the "Hello" String as expected.
testTable.get(new Coordinates(3, 1)); //This will only return a null value.
但是,get()不能正常運行。 它似乎只有在您隨便亂喂它與原始鍵完全相同的對象時才起作用。
是否有任何方法可以糾正此問題並使Hashtable發揮文檔中所述的作用? 我是否需要對Coordinates類中的自定義equals()操作進行任何調整?
為了能夠從基於哈希的集合中存儲和檢索對象,您應該實現/消除Object
類的equals()
和hashCode()
方法。 在您的情況下,您已重寫equals()
並將hashCode()
方法留給了從Object
繼承的默認實現。
這是在實現時必須考慮的hashCode()
方法的一般約定 :
在Java應用程序的執行過程中,只要在同一對象上多次調用它,則hashCode方法必須一致地返回相同的整數,前提是未修改該對象的equals比較中使用的信息。 從一個應用程序的執行到同一應用程序的另一執行,此整數不必保持一致。
如果根據equals(Object)方法,兩個對象相等,則在兩個對象中的每個對象上調用hashCode方法必須產生相同的整數結果。
根據equals(java.lang.Object)方法,如果兩個對象不相等,則不需要在兩個對象中的每個對象上調用hashCode方法必須產生不同的整數結果。 但是,程序員應該意識到,為不相等的對象生成不同的整數結果可能會提高哈希表的性能。
這是從我的IDE生成的示例實現(正如@Peter在注釋區域中提到的那樣),您可以對其進行修改以適合您的要求:
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ex;
result = prime * result + why;
return result;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.