Этот вопрос проверяет понимание работы хэш-таблиц в Java, в частности, как вычисляются хэш-коды и сравниваются ключи, что важно для корректного использования коллекций.
В Java HashMap хранит пары ключ-значение, полагаясь на два метода: hashCode() для определения корзины (bucket) и equals() для точного сравнения ключей внутри корзины. Массивы в Java — это объекты, но они не переопределяют эти методы, наследуя реализацию от класса Object.
Метод hashCode() для массива вычисляется на основе адреса в памяти, а не содержимого элементов. Аналогично, equals() сравнивает ссылки. Это означает, что два массива с одинаковыми элементами будут иметь разные хэш-коды и не будут считаться равными.
import java.util.HashMap;
public class Main {
public static void main(String[] args) {
HashMap map = new HashMap<>();
int[] key1 = {1, 2, 3};
int[] key2 = {1, 2, 3}; // То же содержимое, но другой объект
map.put(key1, "value");
System.out.println(map.get(key1)); // Выведет "value"
System.out.println(map.get(key2)); // Выведет null, потому что key2 != key1
// Даже если изменить key1 после добавления, поиск может сломаться
key1[0] = 99;
System.out.println(map.get(key1)); // Может вернуть null, т.к. хэш изменился
}
}Чтобы использовать содержимое массива для сравнения, нужно:
import java.util.*;
public class Main {
public static void main(String[] args) {
// Использование List как ключа
HashMap, String> map = new HashMap<>();
List key1 = Arrays.asList(1, 2, 3);
List key2 = Arrays.asList(1, 2, 3);
map.put(key1, "value");
System.out.println(map.get(key2)); // Выведет "value", т.к. списки равны по содержимому
}
}Также важно помнить, что ключи в HashMap должны быть неизменяемыми (или, по крайней мере, не менять своё состояние, влияющее на hashCode). Если ключ-массив изменяется после добавления в карту, то его хэш-код может измениться, и найти связанное значение станет невозможно.
Вывод: Использовать массивы примитивов как ключи в HashMap напрямую — плохая практика, ведущая к ошибкам. Вместо этого следует применять неизменяемые объекты с корректной реализацией equals() и hashCode(), такие как List, либо создавать собственные классы-обёртки.