Эффективность: проверка HashMap содержит ключ () против всегда положить () - PullRequest
0 голосов
/ 14 декабря 2018

Если у меня есть HashMap, и я хочу вставить пары ключ-значение с большим количеством дубликатов, лучше сделать: if (!map.containsKey(key)) map.put(key, value); или просто сделать map.put(key,value); независимо от того, существует ли уже пара ключ / значение?

Ответы [ 5 ]

0 голосов
/ 14 декабря 2018

Вы должны использовать метод putIfAbsent.если вы беспокоитесь о перезаписи значения.Этот метод доступен начиная с Java 8.

Он имеет ту же сложность по времени, что и put.

Если у вас все в порядке с перезаписью с последним значением, просто перейдите на put.

0 голосов
/ 14 декабря 2018

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

Как правило, наибольшее снижение производительности происходит при загрузке и компиляции кода.Поэтому самый короткий и простой код, вероятно, уже оптимален.

0 голосов
/ 14 декабря 2018

Если вам плевать на обманщиков, просто наберите map.put(key, value);.Таким образом, вы не будете выполнять дополнительный поиск O (1) (который включает в себя хеширование key, а затем проверку его существования).

В худшем случае это может сэкономить вам n-1дополнительные поиски для случая, когда одна и та же пара (key, value) вставляется повторно.

0 голосов
/ 14 декабря 2018

Обе put и contain имеют одинаковую асимптотическую среду выполнения, поэтому при использовании обоих при максимальном увеличении будет в 2 раза, что постоянно.Так что ваше асимптотическое время выполнения не изменится.Но так как put просто переопределит любое существующее значение (и даже вернет старое значение, и null, если оно новое), это в 2 раза быстрее.

0 голосов
/ 14 декабря 2018

Map::put перезаписывает записи одним и тем же ключом, поэтому было бы эффективнее набрать .put, не проверяя, содержит ли карта ключ.

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