Подтвердить что ты не робот

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

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

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

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

4b9b3361

Ответ 1

Простейшее определение:

При одинаковых входах вы всегда получаете одинаковые выходы.

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

Ответ 2

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

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

Ответ 3

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

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

Ответ 4

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

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

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

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

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

Ответ 5

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

Ответ 6

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

Ответ 7

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

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

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

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

* 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.

Ответ 8

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

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

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

Ответ 9

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

Ответ 10

Недетерминированный означает, что не существует четко определенного поведения.

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

Ответ 11

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

Вот пример: 1.Non-детерминированной

    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.deterministic

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}