Реализации Наборов Java (например, HashMaps по сравнению с HashSet по сравнению с HashTable …), что стоимость выбора является неправильной? [закрытый]

6
задан Bhargav Rao 13 July 2019 в 08:45
поделиться

3 ответа

Это очень общий вопрос, но я добавлю пару мыслей.

Если вы программируете, ориентированные на интерфейсы, то гибкость не сильно пострадает. Например,

void foo(List<E> list);

Цена неправильного выбора может быть замечена в снижении производительности. Например, выбор LinkedList, когда вы ищете прямой доступ (как в ArrayList).

У наборов есть похожая проблема. Если вы хотите сохранить отсортированные коллекции без дубликатов, SortedSet будет более разумным выбором, чем HashSet. В последнем случае вам придется отсортировать весь Набор вручную (это вызов Collections.sort ())

Что касается карт , есть много разных реализаций. У каждого своя цель. Например, есть SortedMap , аналог SortedSet. Затем есть WeakHashMap , который не работает как HashMap в том смысле, что ключи могут быть удалены сборщиком мусора. Как вы понимаете, выбор между HashMap и WeakHashMap нетривиален. Как всегда, все зависит от того, что вы хотите с ними реализовать.

Что касается истории, в моем текущем проекте мы заменили HashSet на SortedSet, потому что это сказалось на производительности. Однако DataCenter не загорелся.

Мои два цента.

7
ответ дан 10 December 2019 в 02:52
поделиться

Какое это имеет значение, если вы следуете хорошей объектно-ориентированной практике в зависимости от абстрактного типа ?

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

1
ответ дан 10 December 2019 в 02:52
поделиться

Я думаю, вы можете использовать HashMap, HashSet и ArrayList в качестве основных реализаций. Когда вам нужен отсортированный набор, хорошо знать, что TreeSet доступен; Аналогичным образом, когда вы делаете рекурсивные вещи, хорошо иметь LinkedList в заднем кармане. Но запрограммируйте интерфейсы, а затем вы можете поменять реализации по мере необходимости. И если одна и та же коллекция требует обработки как (например) как LinkedList, так и ArrayList, нетрудно создать одну из другой.

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

1
ответ дан 10 December 2019 в 02:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: