Java - containsKey() на HashMap, возвращающий null - проверяет ли он точный объект, а не просто соответствующий ключ?

У меня есть HashMap Integer[], Integer[]. Одна из записей:

WEIGHTS.put(новое целое[]{0,0,0,0,0}, новое целое[]{20,20,15,15,10,10,5,5});

Я тогда звоню:

вероятности = WEIGHTS.get(sheriffAndBanditPositions);

где sheriffAndBanditPositions:

Integer[] sheriffAndBanditPositions = new Integer[]{0,0,0,0,0};

Это приводит к тому, что вероятности равны нулю. Почему это? Как я могу проверить, находится ли соответствующий ключ Integer[] в HashMap, если это невозможно? Спасибо!


person James    schedule 02.03.2016    source источник


Ответы (1)


Массив не работает как ключ в HashMap, так как массивы не переопределяют методы hashCode и equals Object. containsKey вернет true только в том случае, если вы передадите тот же самый экземпляр, который вы передали put.

Вы можете использовать List или Set в качестве ключа вместо массива.

Например :

Map<List<Integer>,Integer[]> WEIGHTS = ...
WEIGHTS.put(Arrays.asList(new Integer[]{0,0,0,0,0}), new Integer[]{20,20,15,15,10,10,5,5});
List<Integer> sheriffAndBanditPositions = Arrays.asList(new Integer[]{0,0,0,0,0});
probabilities = WEIGHTS.get(sheriffAndBanditPositions);
person Eran    schedule 02.03.2016
comment
У Guava также есть несколько утилит для этого. - person bmargulies; 02.03.2016
comment
Блин, спасибо за информацию! - person James; 02.03.2016
comment