Может ли кто-нибудь, пожалуйста, объясните это поведение HashMap - PullRequest
0 голосов
/ 10 июня 2018

Моя программа является публичным классом Demo {

public static void main(String[] args) {
    List<String> arr = new ArrayList<>();
    arr.add("a");
    arr.add("b");
    Map<List<String>, String> map = new HashMap<>();
    map.put(arr, "Ravinda");
    System.out.println(map.get(arr));
    arr.add("c");
    System.out.println(map.get(arr));
}

}

Вывод: Ravindra and null

Я не могу понять, почему вывод второй системы.out.println имеет значение null.

Может кто-нибудь объяснить, пожалуйста.

Ответы [ 2 ]

0 голосов
/ 10 июня 2018

Как объясняет этот ответ , вы должны быть осторожны при использовании объекта, хеш-код которого является изменяемым.Метод hashCode для ArrayList варьируется в зависимости от содержащихся в нем элементов, поэтому, добавив "c" в список, вы изменили его хеш-код.

Важно отметить, что даже если хеш-кодне изменился, списки все равно должны были быть равными.Хеш-код объекта не является уникальным идентификатором, поэтому внутренне HashMap использует equals сравнение ключа после получения корзины, в которой он находится.

Если у вас есть программа, которая находится в этой позиции, вынужно сделать шаг назад и определить другое решение проблемы под рукой.Не существует надежного способа использовать изменяемый список на карте, который не сводится к равенству ссылок (что в любом случае делает вещи довольно бессмысленными).

0 голосов
/ 10 июня 2018

Когда вы вызываете: map.put(arr, "Ravinda");, вы устанавливаете ключ значения "Ravinda" в список, содержащий две строки.

Вызывая arr.add("c");, вы изменяете список, использовавшийся ранее для индексации "Значение Ravinda "в вашей хэш-карте.

Поскольку список arr был изменен, он больше не соответствует ключу, указанному при вызове: map.put(arr, "Ravinda");

Вот почему возвращается хэш-картанулевое значение при попытке доступа к нему во второй раз.

Хеш-карта по-прежнему содержит значение 'Ravinda', но это значение индексируется по списку, содержащему только два значения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...