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

Является ли порядок значений, полученных из HashMap, порядком размещения

Я пытаюсь выяснить порядок, в котором значения в HashMap могут быть восстановлены /. Вот фрагмент кода для этого же.

import java.util.HashMap;

public class HashMapExample {

   public static void main(String[] args) {
       HashMap<Integer, String> hashmap = new HashMap<Integer, String>();
       hashmap.put(1, "apple" );
       hashmap.put(2, "lemon" );
       hashmap.put(3, "orange" );
       hashmap.put(4, "banana" );
       hashmap.put(5, "litchi" );
       hashmap.put(6, "mango" );
       hashmap.put(7, "papaya" );

       System.out.println(hashmap.size());

       for (String key : hashmap.values()) {
           System.out.println(key);
       }
   }
}

Выход:

7
apple
lemon
orange
banana
litchi
mango
papaya

Значения печатаются в том порядке, в котором они были вставлены. Это правда в целом? Я ожидал, что значения будут напечатаны в произвольном порядке. Это использует Java 6.

4b9b3361

Ответ 1

Значения печатаются в том порядке, в котором они были вставлены. Это правда в целом? Я ожидал, что значения будут напечатаны в случайном порядке.

API HashMap не определяет порядок итерации.

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

В вашем случае вы используете клавиши Integer, что означает, что значения хэша ключей являются самими значениями ключа. Кроме того, вы вставили записи в порядке очереди. Это приводит (случайно) к порядку итерации, соответствующему порядку ввода. Но если вы продолжаете вставлять больше ключей, вы обнаружите, что порядок итераций "обертывается". Затем, когда таблица проходит через серию изменений, порядок будет становиться все более и более скремблированным.

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

Ответ 2

Из Javadoc: HashMap" класс не дает никаких гарантий относительно порядка карты, в частности, он не гарантирует, что порядок будет оставаться постоянным с течением времени.

Если вам нужен последовательный заказ, вы можете использовать LinkedHashMap (для вставки/порядка доступа) или TreeMap (для сравнения). Обратите внимание, что они поддерживают порядок ключей, а не значения.

Ответ 3

A LinkedHashMap - это то, что вам нужно. Из doco он отличается от HashMap тем, что он поддерживает двусвязный список, проходящий через все его записи.

Ответ 4

Попробуйте LinkedHashMap, если порядок важен... см. в JavaDoc

открытый класс LinkedHashMap расширяет HashMap

Таблица хэшей и связанный список реализация интерфейса карты, с предсказуемым порядком итерации. Эта реализация отличается от HashMap в что он поддерживает двусвязный список просматривая все его записи. Этот связанный список определяет итерацию заказ, который обычно является порядком в котором ключи были вставлены в карта (порядок вставки). Обратите внимание, что порядок вставки не изменяется, если ключ повторно вставлен в карту. (A ключ k снова вставлен в карту m, если m.put(k, v) вызывается, когда m.containsKey(k) вернет true непосредственно перед вызовом.)

Ответ 5

Связанная коллекция java.util.concurrent ConcurrentSkipListMap. A skiplist позволяет перемещать записи по порядку клавиш, а также просматривать их в случайном порядке (но не так быстро, как HashMap).

Там хороший скрипист демонстрационный апплет.