Как хранятся значения Hash Map (если значения являются дубликатами)? - PullRequest
0 голосов
/ 21 января 2019

Сохраняет ли Java HashMap дублирующиеся значения как уникальные или индивидуально?

Давайте представим, что у меня есть следующие значения пары ключ-значение:

A -> "a very long string...."
B -> "another very long string...."
C -> "the same very long string from A key.... (but not same string instance)"

Будет ли этобыть сохранены как 3 ключа и 3 значения, или как 3 ключа и 2 значения (поскольку значение для A точно такое же, как значение для C)

Меня беспокоит вопрос определения размера как значенияспасения довольно велики и не имеют смысла дублировать их.

Ответы [ 4 ]

0 голосов
/ 21 января 2019

Но это не касается HashMap, я имею в виду, что оно не является специфическим для него.Наличие значения String подразумевает также две другие разные вещи - например, интернирование строк или тот факт, что String s являются неизменяемыми.Также HashMap не копирует значение (что бы это ни значило), оно хранит только ссылки на другие объекты - что вы делаете с этими объектами, полностью зависит от вас.Если вы измените Объект за пределами HashMap, а затем запросите Map к этому конкретному связанному ключу, вы увидите обновление.

0 голосов
/ 21 января 2019

A HashMap может содержать повторяющиеся значения, поэтому в вашем примере в Map.

будет 3 ключа и 3 значения.

Однако, если вы обеспокоены тем, что большие экземпляры хранятся несколько раз как значения в вашем Map, вам следует хранить ссылки на один и тот же экземпляр.

Например:

String val = "a very long String............";
String val2 = "a second long String.........";
map.put(1,val);
map.put(2,val2);
map.put(3,val);

Есть только два больших String экземпляра. Map содержит 3 ссылки на эти String s (две ссылки на первую String и одну ссылку на вторую String), но ссылки занимают небольшой объем памяти.

0 голосов
/ 21 января 2019

Он не хранит значения, он хранит ссылки на значения, поэтому проблема сводится к вопросу «Являются ли "a very long string...." и "the same very long string from A key...." одним и тем же объектом в памяти?»

Если они не заданы 'Константы времени компиляции и получены / построены во время выполнения, они разные объекты.Строковое интернирование вместе с String#intern может помочь вам в этом, но имеет свои ограничения, упомянутые @ bratkartoffel.

Что такое интернирование Java String?
Когда мы должны использовать метод интерна String для строковых литералов
Нарушение производительности String.intern ()

0 голосов
/ 21 января 2019

Java HashMap не допускает дублирования ключей, но допускает дублирование значений. Таким образом, они будут сохранены как 3 ключа и 3 значения.

Чтобы оно не сохраняло значение дважды, вам нужно проверить его (например, с помощью метода .containsValue()).

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