Реализации коллекций Java (например,HashMaps vs HashSet vs HashTable ...), какова стоимость неправильного выбора?[закрыто]

StackOverflow https://stackoverflow.com/questions/1033482

Вопрос

В моем коде я по умолчанию использую ArrayList для всех списков, HashMap для всех карт, HashSet для всех наборов.

С практической точки зрения, сколько я теряю в гибкости, масштабируемости, удобочитаемости и производительности, выбирая неправильную реализацию?Когда имеет смысл потратить время на то, чтобы принять решение использовать одно, а не другое?

Я, конечно, вижу очень четкий пример того, почему кто-то будет использовать LinkedList вместо ArrayList при определенных обстоятельствах.Когда кто-то чувствует, что крайне важно использовать HashMap, а не TreeMap или HashTable?А как насчет Наборов?

Вопросы:

  1. Какова цена неправильного выбора?
  2. Есть ли у кого-нибудь истории катастроф о выборе неправильной реализации и возгорании центра обработки данных?
  3. Есть какие-нибудь хорошие эмпирические правила?
  4. Есть ли какие-то непонятные реализации коллекций, без которых вы не можете жить?

Я прочитал до конца:

Я нашел это вопрос должен быть связан с теоретической точки зрения, но меня больше интересует реальный мир, ответ down in the trenches.

Это было полезно?

Решение

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

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

void foo(List<E> list);

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

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

<EDIT>

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

</EDIT>

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

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

Другие советы

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

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

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

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

Такой подход меня еще не обжег.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top