2010-08-25 3 views
30

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

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

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

+0

что вы можете положиться на них, находясь в любом порядке. –

+0

Вот аналогичный вопрос: http://stackoverflow.com/questions/3527216/hashmap-index-issue –

ответ

38

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

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

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

+2

S. Lott - «idempotent», функции 'f', означает, что' f (f (x)) = f (x) 'для всех' x'. Другая идея - «детерминированная». – Hammerite

+0

Позвольте мне попробовать еще раз.Это звучит как определение «без гистерезиса» - результаты не согласуются с подразумеваемой памятью. –

13

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

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

5

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

2

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

0

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

3

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

Хороший пример я нашел:

Рассмотрим список покупок: список пунктов, чтобы купить.

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

* 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

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

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

0

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

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

2

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

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

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

8

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

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

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

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

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

+0

+1 для различения «истинного случайного» и «детерминированного, но непредсказуемого заранее для данной среды» –

-4

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} 
+10

Детерминант не означает, что вы получите их в том порядке, в котором вы их добавили. Скорее, это означает, что для одного и того же набора значений вы всегда будете получать их в том же порядке. – RHSeeger

Смежные вопросы