Считывая этот вопрос и ответ, данный Юджином, я обнаружил, что неизменяемые множества и карты JDK9 будут ввести источник случайности, который повлияет на их обход. Это означает, что порядок итераций действительно будет случайным, по крайней мере, среди разных прогонов JVM.
Поскольку спецификация не гарантирует порядок обхода/итерации для множеств и карт, это абсолютно нормально. Фактически, код никогда не должен опираться на специфические для реализации детали, а на спецификацию.
Я знаю, что сегодня, с JDK 8, если у меня есть a HashSet
и делаю это (взято из связанного ответа):
Set<String> wordSet = new HashSet<>(Arrays.asList("just", "a", "test"));
System.out.println(wordSet);
for (int i = 0; i < 100; i++) {
wordSet.add("" + i);
}
for (int i = 0; i < 100; i++) {
wordSet.remove("" + i);
}
System.out.println(wordSet);
Затем порядок итераций элементов изменится, и два выхода будут отличаться. Это связано с тем, что добавление и удаление 100 элементов в набор изменяет внутреннюю емкость элементов HashSet
и повторяет элементы. И это совершенно правильное поведение. Я не спрашиваю об этом здесь.
Однако с JDK9, если я это сделаю:
Set<String> set = Set.of("just", "a", "test");
System.out.println(set);
И затем, в другом экземпляре JVM, я запускаю тот же код, выходы могут быть разными, потому что рандомизация введена.