簡體   English   中英

有沒有辦法在對象鍵上使用 containsKey() 映射函數?

[英]Is there a way to use the containsKey() map function on an Object key?

我有一個哈希圖,其中包含一個整數數組作為鍵和一個整數作為值。 當我向 hashmap 添加整數時,我創建整數數組變量,然后在 hashmap.put() 調用中使用變量名稱。 問題是我稍后需要搜索 hashmap 鍵以查看給定的整數數組鍵是否存在,但是 hashmap.containsKey() 調用始終返回 false,因為 hashmap 包含對整數數組的引用而不是實際的顯式整數數組.

有沒有一種簡單的方法可以使用給定的整數數組搜索哈希圖?

這是代碼片段:

public static void main (String[] args) {

    Map<int[], Integer> map = new HashMap<int[], Integer>();
    int[] arr1 = {1, 2, 3, 4};
    int[] arr2 = {5, 6, 7, 8};
    map.put(arr1, 1);
    map.put(arr2, 2);
    int[] arr3 = {1, 2, 3, 4};
    System.out.println(map.containsKey(arr3));

}

數組不適合作為HashMap的鍵,因為數組不會覆蓋equalshashCode的默認實現。 因此,即使兩個不同的數組對象(例如您的arr1arr3 )包含完全相同的元素且順序相同,它們也不相等。

您可以使用List<Integer>作為鍵而不是int[] 那可行。

首先,您不能在泛型中使用原始值。 您的代碼將無法編譯。

其次,永遠不要使用可變值作為哈希表鍵。

正式地,您可以使用List<Integer>而不是int[] ,但這將導致將來難以調試的錯誤。 當您在哈希表中按關鍵字訪問或搜索時,將為您的值計算一個哈希碼,並在此哈希表的已知列表中搜索恆定時間。 如果您的代碼更改了您使用鍵定義的對象,那么您將不再在哈希表中找到該鍵值對。

我不建議您使用List<Integer>作為哈希表鍵,盡管這將解決問題中描述的問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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