Ответ
Ключи в коллекциях, реализующих интерфейс Map<K, V>, должны быть объектами. Примитивные типы (int, char, boolean и др.) не являются объектами в Java.
Механизм работы: Java использует автоупаковку (autoboxing) для автоматического преобразования примитива в соответствующий объект-обертку (например, int → Integer) при добавлении в коллекцию.
Пример:
Map<Integer, String> map = new HashMap<>();
map.put(1, "One"); // Автоупаковка: примитив 1 преобразуется в Integer.valueOf(1)
int key = 5;
map.put(key, "Five"); // Также работает через автоупаковку
Важные нюансы:
- Производительность: Автоупаковка создает объект, что влечет накладные расходы по памяти и времени. В высокопроизводительных циклах это может быть значимо.
nullзначения: Примитив не может бытьnull, аInteger— может.map.get(999)вернетnull, если ключа нет, что безопасно. Работа же сintпотребовала бы отдельной проверки.- Неизменяемость: Обертки (
Integer,Long) являются неизменяемыми (immutable), что критически важно для корректной работыHashMap(чтобы хэш-код ключа не менялся). - Специализированные коллекции: Для исключения накладных расходов существуют сторонние библиотеки (например,
Eclipse Collections,fastutil), предлагающиеIntObjectMapи аналоги.