簡體   English   中英

Hashtable get()操作無法按照文檔進行操作

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM