¿Qué significa determinista?


Estoy leyendo la documentación de Java Hashmap pero no entiendo esta oración.

Tenga en cuenta que el orden de iteración para HashMap no es determinista. Si querer iteración determinista, usar LinkedHashMap.

¿Qué significa determinista?

Author: Peter Tillemans, 2010-08-26

11 answers

La definición más simple:

Dadas las mismas entradas, siempre obtiene las mismas salidas.

Arriba, está diciendo que iterar a través del mismo HashMap exacto puede dar diferentes resultados en diferentes momentos, incluso cuando no has cambiado nada. Por lo general, eso no importa, pero si lo hace, debe usar un LinkedHashMap.

 41
Author: bukzor,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-08-25 21:40:07

En un orden que puede ser "determinado" de antemano.

Debido a la forma en que funciona el hashing, los elementos del mapa se "codifican" en ubicaciones arbitrarias. Las posiciones revueltas no se pueden determinar fácilmente por adelantado they no son determinables you no sabes el orden resultante.

 13
Author: S.Lott,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-08-25 21:37:09

En términos más simples: Cuando llamas a keys(), values() o entrySet (), obtienes una colección, sobre la cual puedes iterar. Esa línea dice que no se puede esperar que el orden en el que el iterador devuelve los objetos sea cualquier orden en particular. Especialmente, puede ser diferente tanto del orden de inserción como del orden natural por valores clave.

Si desea que el iterador funcione en orden de inserción, utilice un LinkedHashMap. Si desea iterar por valor de clave, utilice un mapa de árbol. Tenga en cuenta que ambos tienen un rendimiento ligeramente peor que un HashMap simple, ya que ambos tienen que hacer trabajo adicional para realizar un seguimiento del orden.

 8
Author: Jim Garrison,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-08-25 21:40:58

Estrictamente hablando, el orden de iteración de HashMap es casi seguro no no determinista. Al igual que la gran mayoría de los procesos computacionales, si lo pasas exactamente de la misma manera, los resultados serán exactamente los mismos. Un sistema verdaderamente no determinista incorporaría algún elemento aleatorio externo, lo que es muy poco probable que sea el caso aquí. Al menos en la mayoría de los casos.

Lo que realmente significa, creo, es que solo porque el mapa contiene una conjunto particular de elementos, usted no debe esperar que cuando se itera sobre ellos saldrán en un orden particular. Eso no significa que el orden de iteración sea aleatorio, solo significa que como desarrollador no debes apostar por saber qué es.

En la mayoría de los casos, la razón de esto es que habrá cierta dependencia de algunos detalles de implementación que pueden variar de una plataforma a otra, y/o en el orden de acceso. Y este último puede a su vez ser determinado por hilo programación y calendario de eventos, que son innatamente impredecibles.

En la mayoría de los casos, en cualquier plataforma individual y con el modelo de enhebrado más común a una sola aplicación enhebrada if si siempre insertas y eliminas un conjunto particular de cosas en la secuencia X siempre las sacarás en la secuencia Y. Es solo que Y será tan exactamente dependiente de X, y en la plataforma, que no tiene sentido ni siquiera pensar en lo que va a ser.

Básicamente, a pesar de que no es aleatorio, bien podría ser.

 8
Author: walkytalky,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-08-25 22:18:26

Determinista : se puede determinar
no determinista : no se puede determinar

 5
Author: µBio,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-08-25 21:37:44

Es un algoritmo que cuando se le da una entrada particular producirá la misma salida.

Un buen ejemplo que encontré:

Considere una lista de compras: una lista de artículos para comprar.

Se puede interpretar de dos maneras:

* 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.
 3
Author: Abe Miessler,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-08-25 21:40:24

Determinista significa que el resultado es predecible / previsible.

 2
Author: StuartLC,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-08-25 21:38:20

no determinista significa que no hay un solo resultado que puedas averiguar de antemano. Una expresión aritmética, como 1 + 2 o log e, es determinista. Hay exactamente una respuesta correcta y puedes averiguarla por adelantado. Arroja un puñado de arena al aire, y donde caerá cada grano es efectivamente no determinista para cualquier grado mayor de precisión.

Esto probablemente no es precisamente correcto, ya que podría mirar el código fuente de la biblioteca subyacente e implementación de JVM y probablemente habría alguna forma de determinar el orden que resultaría. Podría ser más correcto para ellos decir,"Ningún orden en particular está garantizado", o algo por el estilo.

Lo que es relevante en este caso es que no puede confiar en el pedido.

 2
Author: Jesse Millikan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-08-25 21:45:15

Esta es la propiedad de HashMap donde los elementos no se iteran en el mismo orden en que se insertaron, ya que HashMap no inserta elementos en orden. Por lo tanto, la línea en la documentación

 0
Author: Fazal,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-08-25 21:39:08

No determinista significa que no hay un comportamiento bien definido.

En el caso del HashMap dependiendo de cómo se insertan los elementos, es posible que tenga uno u otro orden de iteración.

 0
Author: jdehaan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-08-25 21:41:50

HashMap no mantiene el orden de lo que agrega, si desea que su salida sea el orden de lo que agrega, debe usar LinkedHashMap, por lo que deterministic significa salida ordenadamente lo que agrega.

Aquí está el ejemplo: 1.no determinista

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

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}
 -4
Author: jason,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-08-30 02:03:13