Тот же порядок итераций на 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
?
Ответы
Ответ 1
Нет, нет никакой гарантии, хотя на практике это произойдет (нет никаких оснований для того, чтобы карта использовала другой итератор для ключей и значений).
Если вы хотите гарантировать порядок итерации, выполните итерацию entrySet()
:
for (Map.Entry<Integer,Integer> entry : map.entrySet())
// ...
Поскольку вы спрашиваете о HashMap
, обратите внимание также, что любые изменения на карте потенциально меняют порядок итераций в результате перепрограммирования карты.
Ответ 2
Нет, не гарантировано. Один из них - Set
, а один - Collection
, и не гарантирует порядок.
Если вы хотите сохранить порядок. Может быть LinkedHashMap()
с entrySet()
помочь вам.
Ответ 3
Да. Вроде. Вы можете использовать подкласс SortedMap, то есть TreeMap. Это будет держать ключи в естественном порядке. (или вы можете дать ему конкретный компаратор). Но когда вы используете древовидную карту, вам нужно убедиться, что метод compareTo должен быть совместим с равными. Прочтите javadocs для более подробной информации. Но, короче говоря, да, вы МОЖЕТ сортировать карту.