![](/img/trans.png)
[英]Does java.util.HashMap.containsKey(Object key) implementation violate java.util.Map.containsKey(Object key) documentation?
[英]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
的鍵,因為數組不會覆蓋equals
和hashCode
的默認實現。 因此,即使兩個不同的數組對象(例如您的arr1
和arr3
)包含完全相同的元素且順序相同,它們也不相等。
您可以使用List<Integer>
作為鍵而不是int[]
。 那可行。
首先,您不能在泛型中使用原始值。
您的代碼將無法編譯。
其次,永遠不要使用可變值作為哈希表鍵。
正式地,您可以使用List<Integer>
而不是int[]
,但這將導致將來難以調試的錯誤。 當您在哈希表中按關鍵字訪問或搜索時,將為您的值計算一個哈希碼,並在此哈希表的已知列表中搜索恆定時間。 如果您的代碼更改了您使用鍵定義的對象,那么您將不再在哈希表中找到該鍵值對。
我不建議您使用List<Integer>
作為哈希表鍵,盡管這將解決問題中描述的問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.