В Java, почему мы не можем использовать общую структуру DataStructure, такую ​​как HashMap, для всех сценариев? - PullRequest
0 голосов
/ 19 января 2011

С тех пор аппаратное обеспечение становится очень дешевым и имеет очень большой объем доступной памяти в наши дни. Почему мы не можем использовать общую структуру DataStructure, такую ​​как HashMap для всех сценариев?Если нет, есть ли где-нибудь краткое руководство, чтобы узнать, какую DataStructure использовать в каком сценарии?

Ответы [ 4 ]

5 голосов
/ 19 января 2011

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

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

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

Например, если вы хотите, чтобы ваши записи на карте были посещеныв определенном порядке во время итерации (на основе ключей) вы можете использовать TreeMap.Если вы хотите, чтобы порядок итераций основывался на том порядке, в котором они были вставлены, используйте LinkedHashMap.Если вам нужна хорошая производительность при простом параллельном доступе (с семантикой put-if-отсутствующий), используйте ConcurrentHashMap.Если ваши ключи являются перечислениями, то EnumMap - самая эффективная реализация.Если вы хотите, чтобы ключи хранились как слабые ссылки, используйте WeakHashMap.Если вы хотите выполнить поиск на основе конкретного используемого объекта (делая его безопасным для изменяемых ключей), используйте IdentityHashMap.

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

И есть много других возможных функций, которые вы можете пожелатьВаша структура данных, чтобы иметь возможность, которая не покрыта, включает (но не ограничивается):

  • Определенный порядок итерации, который не отсортирован по ключу или порядок вставки
  • Размер-ограниченность (особенно с настраиваемым выбором того, какую запись выгнать)
  • Мягкие / фантомные ссылки для клавиш
  • Ленивая инициализация, когда get() выполняется для ключа, которого там нет

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


Обращение к выражению «аппаратные средства дешево» - это правда, но время программиста и пользователя - нет.В некоторых случаях критический цикл приложения может включать в себя много поисков на карте, так что ускорение этих поисков окажет заметное влияние на производительность.Конечно, обычно это не так, но если это так, то выбор карты с более высокой производительностью для конкретной ситуации (простой пример, который приходит на ум - использование EnumMap, где это уместно) приведет к повышению производительности - что можеточень важно.

В качестве альтернативы, некоторые реализации карт просто упрощают написание окружающего кода, его легче понимать и с меньшей вероятностью скрывать ошибки.Примером здесь может быть случай с отложенной инициализацией карты (что-то вроде ComputingMap из Google Collections).В то время как вы можете написать некоторый код с семантикой lazy-init вокруг стандартного HashMap, упаковав всю эту логику в саму реализацию карты, становится легче проверять правильность - и клиентская логика намного проще.

Так что дешевое оборудование / пространство не означает, что HashMaps оптимальны для всего.На самом деле, если что-то и является контраргументом - HashMaps достаточно экономичны по сравнению с более индивидуальными альтернативами, которые вы могли бы принять.Имея много доступного дешевого пространства, можно полностью заменить пространство временем и хранить много информации, чтобы ускорить поиск.


Обратите внимание, что я интерпретировал ваш вопрос как ", почему иногда вы можете использовать другие классы Map?"а не " который другой Maps следует использовать и когда?"Если это последнее, не стесняйтесь перефразировать или задать другой вопрос, который фокусируется на этом более конкретно.

2 голосов
/ 19 января 2011

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

HashMap - это карта, которая не всегда является тем, что вы хотите - иногда наиболее подходящим является список или стек.

Чтобы ответить на вторую часть вашего вопроса, хотите верьте, хотите нет, но одна из лучших вещей, которые я когда-либо делал, - это чтение javadoc для пакета Collections; у каждого класса есть заметки, которые я нашел действительно полезными. Например, http://download.oracle.com/javase/6/docs/api/java/util/Collections.html дает обзор, а затем выбирает любую реализацию, например, стек, чтобы узнать о ней больше.

Удачи!

2 голосов
/ 19 января 2011

Поскольку Hashmap не упорядочен, потому что иногда трудно определить стабильный хэш-код ... По многим причинам существуют другие структуры.Хорошее введение - учебник по коллекциям Java: http://download.oracle.com/javase/tutorial/collections/index.html

1 голос
/ 19 января 2011

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

Вот немного чтения: http://www.devx.com/tips/Tip/14639

http://java.sun.com/docs/books/performance/1st_edition/html/JPAlgorithms.fm.html (CTRL + F "8,4")

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