Набор возвращен из HashMap.entryset(), как он отсортирован?
Мне нужно реплицировать сортировку, которую я получаю на множестве, возвращенном функцией entrySet() из класса HashMap. Я не понимаю, как это отсортировано.
Следующий код:
HashMap<String, Integer> testList = new HashMap<String, Integer>();
testHash.put("B", 1);
testList.put("A", 3);
testList.put("E", 2);
testList.put("D", 5);
testList.put("C", 4);
//testList.put("B", 1);
//testList.put("C", 4);
//testList.put("A", 3);
//testList.put("E", 2);
//testList.put("D", 5);
for (Map.Entry<String, Integer> entry : testList.entrySet()) {
System.out.println(entry.getKey() + " - " + entry.getValue());
}
Возвращает:
D - 5
E - 2
A - 3
B - 1
C - 4
Зачем? Код с комментариями возвращает их в том же порядке.
1 ответ
Я не понимаю, как это отсортировано.
Это потому, что он не следует определенному порядку. Фактическое упорядочение зависит от хеш-кодов элементов, которые вы вводите, от того, в каком порядке вы их поместили, и от количества хеш-блоков (тесно связанных с коэффициентом загрузки).
Независимо от того, в каком порядке я положил предметы в
HashMap
всегда возвращает их в том же порядке.
Это связано с тем, что количество элементов одинаково, хэш-коды элементов одинаковы, и вы не встретили порядок, который приводит к переупорядочению вывода из-за коллизий хеш-функций.
Можно построить порядок, который бы несколько отличался для одной и той же группы товаров. Урок на вынос, однако, заключается в том, что заказ ненадежен, поэтому вы не должны ожидать, что ваши товары поступят в каком-то конкретном порядке.
Если вы должны поддерживать определенный порядок, Java предлагает два хороших варианта:
- Вы можете использовать
LinkedHashMap
для предсказуемого порядка, основанного на порядке вставки, или - Ты можешь использовать
TreeMap
который заказывает ваши вещи на ключах.