Набор возвращен из 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 который заказывает ваши вещи на ключах.
Другие вопросы по тегам