2009-07-27 3 views
56

Я использую связанныйHashMap, чтобы гарантировать заказ, когда кто-то пытается получить к нему доступ. Однако, когда приходит время перебирать его, используется ли функция entrySet() для возврата гарантийного поручения с ключом/значением? Во время повтора никаких изменений не будет.Имеет ли entrySet() в LinkedHashMap также гарантийный заказ?

EDIT: Также есть ли какие-либо побочные эффекты от итерации по карте, итерации через ее ключи и вызова?

+0

Я собирался задать тот же вопрос, но зачем спрашивать его, если кто-то еще спросил и получил хороший ответ? +1 за хороший вопрос. – uTubeFan

+0

В LinkedHashMap вы можете использовать порядок вставки и порядок доступа. Заказ всегда поддерживается. Пожалуйста, приложите мою [внутреннюю жизнь LinkedHashMap] (http://volodial.blogspot.com/2013/07/internal-life-of-linkedhashmap-in-java.html) учебник –

+0

Возможный дубликат [Является ли заказ гарантированным для возврат ключей и значений из объекта LinkedHashMap?] (http://stackoverflow.com/questions/2923856/is-the-order-guaranteed-for-the-return-of-keys-and-values-from-a- linkedhashmap-o) – Roland

ответ

43

Согласно Javadocs, да ,

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

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

+11

, но entrySet возвращает Set, который неупорядочен сам? –

+3

Да, технически сам элемент entrySet не имеет доступа к доступу к позиции, но делает entrySet.iterator(). Итератор позволяет нам иметь упорядоченный список. – Jpatrick

+2

Я хотел бы знать, что этот ответ правильный, но, как указал Джонатан, 'entrySet()' возвращает Set. Jpatrick говорит, что итератор набора позволяет нам иметь упорядоченный список, но http://docs.oracle.com/javase/6/docs/api/java/util/Set.html#iterator() говорит: «Элементы возвращаются без конкретный порядок (если этот набор не является экземпляром какого-либо класса, который предоставляет гарантию) ». И ни один из упомянутых здесь документов не говорит, что entrySet() возвращает Set, это экземпляр класса, который гарантирует порядок. Я что-то упускаю? – LarsH

1

Этот связанный список определяет порядок итераций, который обычно является порядком, в котором ключи были вставлены в карту (порядок вставки). Обратите внимание, что порядок вставки не изменяется, если ключ повторно вставлен в карту. (Ключ к повторной установки на карте м, если m.put (к, v) вызывается при m.containsKey (к) будет возвращена истина непосредственно перед вызовом.)

1

Если вы уверены, что никаких изменений не будет сделано во время итерации, то гарантируется надлежащий порядок с entrySet(), как указано в API.

+1

Документы API, к которым вы привязались для' entrySet() ', ничего не говорят о гарантии правильного упорядочения. Единственным связанным утверждением на этой странице является «Этот класс [т.HashMap] не дает никаких гарантий относительно порядка карты; в частности, он не гарантирует, что заказ будет оставаться постоянным с течением времени ». Что вы имели в виду с этой ссылкой? – LarsH