Вы НИКОГДА не должны зависеть от порядка хэш-карты.
Если вам нужна карта с детерминированным порядком, я предлагаю вам использовать SortedMap / SortedSet, например TreeMap / TreeSet, или использовать LinkedHashMap / LinkedHashSet. Я использую последнее часто, не потому, что программе нужен порядок, а потому, что ее легче читать журналы / отлаживать состояние карты. т.е. когда вы добавляете ключ, он каждый раз заканчивается до конца.
Вы можете создать два HashMap / HashSet с одинаковыми элементами, но получать разные заказы в зависимости от емкости коллекции. Тонкие различия в том, как работает ваш код, могут привести к другому итоговому размеру корзины и, следовательно, к другому порядку.
, например
public static void main(String... args) throws IOException {
printInts(new HashSet<Integer>(8,2));
printInts(new HashSet<Integer>(16,1));
printInts(new HashSet<Integer>(32,1));
printInts(new HashSet<Integer>(64,1));
}
private static void printInts(HashSet<Integer> integers) {
integers.addAll(Arrays.asList(0,10,20,30,40,50,60,70,80,90,100));
System.out.println(integers);
}
печать
[0, 50, 100, 70, 40, 10, 80, 20, 90, 60, 30]
[0, 50, 100, 70, 80, 20, 40, 10, 90, 60, 30]
[0, 100, 70, 40, 10, 50, 80, 20, 90, 60, 30]
[0, 70, 10, 80, 20, 90, 30, 100, 40, 50, 60]
Здесь у вас есть HashSet (s) с одинаковыми значениями, добавленными в том же порядке, что приводит к различным порядкам итераторов. Возможно, вы не играете с конструктором, но ваше приложение может косвенно вызывать другой размер корзины.