I am reading the Java Hashmap documentation but I don't understand this sentence.
Note that the iteration order for HashMap is non-deterministic. If you want deterministic iteration, use LinkedHashMap.
What does deterministic mean?
Простейшее определение:
Учитывая те же входные данные, вы always получаете одни и те же выходные данные.
Выше говорится, что итерация через один и тот же HashMap может дать разные результаты в разное время, даже если вы ничего не изменили. Обычно это не имеет значения, но если это так, вы должны использовать LinkedHashMap.
В порядке, который можно «определить» заранее.
Из-за того, как работает хеширование, элементы на карте «зашифрованы» в произвольные места. Позиции скремблирования не могут быть легко определены заранее - они не поддаются определению - вы не знаете конечный порядок.
детерминированный: можно определить
недетерминированный: невозможно определить
Это алгоритм, который при задании определенных входных данных выдает тот же результат.
Хороший пример, который я нашел:
Рассмотрите список покупок: список предметы для покупки.
Это можно интерпретировать двумя способами:
* Указание купить все эти предметы в любом порядке. Это недетерминированный алгоритм. * Инструкция купить все эти предметы в указанном порядке. Это детерминированный алгоритм.
Недетерминированный означает, что нет ни одного единственного результата, который вы могли бы вычислить заранее. Арифметическое выражение, такое как 1 + 2 или log e, является детерминированным. Есть только один правильный ответ, и вы можете понять его заранее. Бросьте горсть песка в воздух, и то, куда упадет каждая песчинка, эффективно недетерминировано для любой большой степени точности.
Возможно, это не совсем правильно, так как вы могли бы посмотреть на исходный код базовой библиотеки и реализации JVM, и вероятно вы могли бы определить порядок, который получится в результате. Возможно, для них правильнее было бы сказать: «Никакой конкретный порядок не гарантируется» или что-то в этом роде.
В данном случае важно то, что вы не можете полагаться на порядок.
HashMap не поддерживает порядок того, что вы добавляете, если вы хотите, чтобы ваш вывод был в том порядке, в котором вы добавляете, вам следует использовать LinkedHashMap, поэтому детерминированный
означает вывод упорядоченно того, что вы добавляете.
Здесь пример: 1.недетерминированный
HashMap<String, Integer> map = new HashMap<String,Integer>();
map.put("a",5);
map.put("b",16);
map.put("c",46);
System.out.println(map); //ouptput:{a=5, c=46, b=16}
2.детерминированный
HashMap<String, Integer> map = new LinkedHashMap<String,Integer>();
map.put("a",5);
map.put("b",16);
map.put("c",46);
System.out.println(map); //output:{a=5, b=16, c=46}
Детерминированный означает, что результат предсказуем / предсказуем.
Недетерминированный означает отсутствие четко определенного поведения.
В случае с HashMap в зависимости от того, как вы вставляете элементы, у вас может быть тот или иной порядок итерации.
Проще говоря: когда вы вызываете keys(), values() или entrySet(), вы возвращаете коллекцию, которую вы можете перебирать. В этой строке говорится, что вы не можете ожидать, что порядок, в котором итератор возвращает объекты, будет каким-то определенным порядком. В частности, он может отличаться как от порядка вставки, так и от естественного упорядочения по значениям ключа.
Если вы хотите, чтобы итератор работал в порядке вставки, используйте LinkedHashMap. Если вы хотите выполнить итерацию по значению ключа, используйте TreeMap. Имейте в виду, что оба они имеют немного худшую производительность, чем обычный HashMap, поскольку им обоим приходится выполнять дополнительную работу, чтобы отслеживать порядок.
Это свойство HashMap, где элементы не итерируются в том же порядке, в котором они были вставлены, поскольку HashMap не вставляет элементы по порядку. Поэтому строка в документации