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

Тот же порядок итераций на Map.keySet и Map.values?

Для отображения типа:

Map<Integer, Integer> map = ...;
map.put(1, 1);
map.put(2, 2);
map.put(3, 3);
map.put(4, 4);

Этот код...

for (Integer i : map.keySet()) System.out.println(i);
for (Integer i : map.values()) System.out.println(i);

... гарантированно печатать одну и ту же последовательность дважды?

Если нет, существуют ли какие-либо гарантии, например, java.util.HashMap?

4b9b3361

Ответ 1

Нет, нет никакой гарантии, хотя на практике это произойдет (нет никаких оснований для того, чтобы карта использовала другой итератор для ключей и значений).

Если вы хотите гарантировать порядок итерации, выполните итерацию entrySet():

for (Map.Entry<Integer,Integer> entry : map.entrySet())
    // ...

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

Ответ 2

Нет, не гарантировано. Один из них - Set, а один - Collection, и не гарантирует порядок.

Если вы хотите сохранить порядок. Может быть LinkedHashMap() с entrySet() помочь вам.

Ответ 3

Да. Вроде. Вы можете использовать подкласс SortedMap, то есть TreeMap. Это будет держать ключи в естественном порядке. (или вы можете дать ему конкретный компаратор). Но когда вы используете древовидную карту, вам нужно убедиться, что метод compareTo должен быть совместим с равными. Прочтите javadocs для более подробной информации. Но, короче говоря, да, вы МОЖЕТ сортировать карту.