Подтвердить что ты не робот

Сборники Java, поддерживающие порядок вставки

Почему некоторые структуры данных сбора данных не поддерживают порядок вставки? Какая особенность достигается по сравнению с поддержанием порядка вставки? Получаем ли мы что-то, если не поддерживаем порядок?

4b9b3361

Ответ 1

Производительность. Если вы хотите иметь первоначальный порядок вставки, есть классы LinkedXXX, которые поддерживают дополнительный связанный список в порядке размещения. В большинстве случаев вам все равно, поэтому вы используете HashXXX или хотите естественный порядок, поэтому вы используете TreeXXX. В любом из этих случаев, почему вы должны оплачивать дополнительную стоимость связанного списка?

Ответ 2

Коллекции не поддерживают порядок вставки. Некоторые просто по умолчанию добавили новое значение в конце. Поддержание порядка вставки полезно только в том случае, если вы назначаете приоритет объектам или используете их для сортировки объектов каким-либо образом.

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

  • Списки поддерживают порядок вставки, так как просто добавление новой записи в конце или в начале является самой быстрой реализацией метода add (Object).

  • Наборы Реализации HashSet и TreeSet не поддерживают порядок вставки, поскольку объекты сортируются для быстрого поиска и для поддержания порядка вставки потребуется дополнительная память. Это приводит к увеличению производительности, поскольку порядок вставки почти никогда не интересен для Sets.

  • ArrayDeque Deque может использоваться для простых que и stack, поэтому вы хотите иметь "первый в первом" или "первый в последнем" режиме, оба требуют, чтобы ArrayDeque поддерживает порядок вставки. В этом случае порядок вставки поддерживается как центральная часть договора классов.

Ответ 3

  • Порядок вставки по существу не поддерживается в хэш-таблицах - это то, как они работают (прочитайте статью, связанную с деталями, чтобы понять подробности), Можно добавить логику для поддержания порядка вставки (как в LinkedHashMap), но это занимает больше кода и во время работы больше памяти и больше времени. Потеря производительности обычно невелика, но может быть.
  • Для TreeSet/Map основной причиной их использования является естественный порядок итераций и другие функциональные возможности, добавленные в интерфейс SortedSet/Map.

Ответ 4

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

Для Карт обычно используется HashMap и TreeMap. Используя хеш-коды, записи могут быть помещены в небольшие группы, которые можно легко найти. TreeMap поддерживает отсортированный порядок вставленных записей за счет более медленного поиска, но проще сортировать, чем HashMap.

Ответ 5

Когда вы используете данные HashSet (или HashMap), данные хранятся в "ведрах" на основе хэша вашего объекта. Таким образом, ваши данные легче получить доступ, потому что вам не нужно искать эти данные во всем наборе, вам просто нужно посмотреть в нужном ведре.

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

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

Ответ 6

Почему необходимо поддерживать порядок вставки? Если вы используете HashMap, вы можете получить запись key. Это не означает, что он не предоставляет классы, которые делают то, что вы хотите.

Ответ 7

Theres в разделе "Cookie" в "O'Reilly Java" под названием "Избегайте стремления к сортировке". Вопрос, который вы должны задать, на самом деле является противоположностью вашего первоначального вопроса... "Мы что-то получаем, сортируя?" Требуется много усилий, чтобы сортировать и поддерживать этот порядок. Конечно, сортировка проста, но обычно она не масштабируется в большинстве программ. Если вы собираетесь обрабатывать тысячи или десятки тысяч запросов (insrt, del, get и т.д.) В секунду, серьезно ли вы будете использовать отсортированную или не отсортированную структуру данных.

Ответ 8

Некоторые коллекции не поддерживают порядок, потому что они вычисляют хэш-код содержимого и соответственно хранят его в соответствующем ведре.

Ответ 9

Я не могу ссылаться на ссылку, но по дизайну реализации List и Set интерфейса Collection в основном расширяемы Array s. Поскольку Collections по умолчанию предлагают методы для динамического добавления и удаления элементов в любой точке, в которых Array нет - порядок вставки может не сохраниться. Таким образом, поскольку существует множество методов манипуляции с содержимым, существует необходимость в специальных реализациях, которые сохраняют порядок.

Другим моментом является производительность, так как наиболее эффективным Collection может быть не тот, который сохраняет свой порядок вставки. Однако я не уверен, как именно Collections управляет своим контентом для повышения производительности.

Итак, короче говоря, две основные причины, по которым я могу думать о том, почему существуют реализации Collection, сохраняющие порядок:

  • Архитектура классов
  • Производительность

Ответ 10

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