Что означает детерминированный означает?

Я читаю документацию Java Hashmap, но я не понимаю этого предложения.

обратите внимание, что порядок итерации для HashMap является недетерминированным. Если вы хотите детерминированную итерацию, используйте LinkedHashMap.

Что означает детерминизм?

11 ответов


самое простое определение:

учитывая те же входные данные, вы всегда получить те же самые результаты.

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


в порядке, который может быть "определено" заранее.

из-за того, как работает хэширование, элементы на карте "скремблируются" в произвольные местоположения. Позиции скремблирования не могут быть легко определены заранее - они не поддаются определению - вы не знаете результирующего порядка.


проще говоря: при вызове keys (), values() или entrySet () вы получаете коллекцию, над которой вы можете перебирать. Эта строка говорит, что вы не можете ожидать, что порядок, в котором итератор возвращает объекты, будет каким-то конкретным порядком. Особенно, он может отличаться как от порядка вставки, так и от естественного порядка по ключевым значениям.

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


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

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

в большинстве случаев причиной этого является то, что будет некоторая зависимость от некоторых деталей реализации, которые могут варьироваться от платформы к платформе и/или от порядка доступа. И последнее может в поворот определяется расписанием потоков и временем событий, которые изначально непредсказуемы.

в большинстве случаев, на любой отдельной платформе и с наиболее распространенной потоковой моделью-однопоточным приложением-Если вы всегда вставляете и удаляете определенный набор вещей в последовательности X, вы всегда будете получать их в последовательности Y. просто Y будет настолько точно зависеть от X, и на платформе, что нет смысла даже думать о том, что это будет быть.

в основном, хотя это не случайный, это может быть так же хорошо.


детерминированный: может быть определен
недетерминированный: не может быть определен


это алгоритм, который при заданном конкретном входе будет производить тот же выход.

хороший пример, который я нашел:

рассмотрим список покупок: Список предметы для покупки.

Это можно интерпретировать двумя способами:

* The instruction to buy all of those items, in any order. 
   This is a nondeterministic algorithm.
* The instruction to buy all of those items, in the order given. This is a 
   deterministic algorithm.

детерминированный означает, что результат предсказуем / forseeable.


недетерминированный означает, что нет ни одного результата, который вы можете понять заранее. Арифметическое выражение, такое как 1 + 2 или log e, является детерминированным. Есть только один правильный ответ, и вы можете понять это заранее. Бросьте горсть песка в воздух, и куда упадет каждое зернышко-это эффективно недетерминированный для любой большой степени точности.

Это, вероятно, не совсем правильно, так как вы могли бы посмотреть на источник код базовой библиотеки и реализации JVM и там будет наверное быть каким-то образом, чтобы вы могли определить порядок, который приведет. Возможно, правильнее было бы сказать: "никакой конкретный порядок не гарантирован" или что-то в этом роде.

в этом случае важно то, что вы не можете полагаться на заказ.


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


non deterministic означает, что нет четко определенного поведения.

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


HashMap не поддерживает порядок, который вы добавляете, если вы хотите, чтобы ваш вывод был порядком, который вы добавляете, вы должны использовать LinkedHashMap, поэтому deterministic означает выход orderdly того, что вы добавите в.

- это : 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}