Является ли порядок значений, полученных из 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.
Ответы
Ответ 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).
Там хороший скрипист демонстрационный апплет.