uso software programa para online objectaid libre herramientas hacer gratis diagramas crear clases casos java

java - software - programa para hacer diagramas uml



Casos de uso para IdentityHashMap (7)

Esta es una experiencia práctica de mi parte:

IdentityHashMap deja una huella de memoria mucho más pequeña en comparación con HashMap para cardinalidades grandes.

¿Podría alguien decir cuáles son los casos de uso importantes de IdentityHashMap ?


HashMap crea objetos de entrada cada vez que agregas un objeto, lo que puede poner mucho énfasis en el GC cuando tienes muchos objetos. En un HashMap con 1,000 objetos o más, terminará usando una buena parte de su CPU simplemente haciendo que el GC limpie las entradas (en situaciones como el pathfinding u otras colecciones de un solo disparo que se crean y luego se limpian). IdentityHashMap no tiene este problema, por lo que terminará siendo significativamente más rápido.

Vea un punto de referencia aquí: http://www.javagaming.org/index.php/topic,21395.0/topicseen.html


La documentations dice:

Un uso típico de esta clase es la transformación de gráficos de objetos que preservan la topología, como la serialización o la copia profunda. Para realizar dicha transformación, un programa debe mantener una "tabla de nodos" que realiza un seguimiento de todas las referencias de objetos que ya se han procesado. La tabla de nodos no debe equiparar objetos distintos incluso si son iguales. Otro uso típico de esta clase es mantener objetos proxy. Por ejemplo, una instalación de depuración podría desear mantener un objeto proxy para cada objeto en el programa que se está depurando.


Siempre que desee que sus claves no sean comparadas por equals sino por == utilizaría un IdentityHashMap. Esto puede ser muy útil si está haciendo un montón de manejo de referencias, pero está limitado a casos muy especiales solamente.


También puede usar IdentityHashMap como un mapa de propósito general si puede asegurarse de que los objetos que usa como claves serán iguales si y solo si sus referencias son iguales.

¿Para qué ganar? Obviamente, será más rápido y utilizará menos memoria que las implementaciones como HashMap o TreeMap .

En realidad, hay muchos casos en que esto se mantiene. Por ejemplo:

  • Enum s. Aunque para las enumeraciones hay incluso una mejor alternativa: EnumMap
  • Objetos de Class . También son comparables por referencia.
  • String Internas s. Ya sea especificándolos como literales o llamando a String.intern() en ellos.
  • Instancias en caché. Algunas clases proporcionan almacenamiento en caché de sus instancias. Por ejemplo, citando desde el javadoc de Integer.valueOf(int) :

    Este método siempre almacenará en caché los valores en el rango de -128 a 127, inclusive ...

  • Ciertas bibliotecas / marcos administrarán exactamente una instancia de los tipos de ceratina, por ejemplo, los frijoles de primavera.
  • Tipos singleton. Si usa los valores de los tipos que se construyen con el patrón Singleton , también puede estar seguro de que (a lo sumo) existe una instancia de ellos y, por lo tanto, la prueba de igualdad de referencia calificará para la prueba de igualdad.
  • Cualquier otro tipo en el que se ocupe explícitamente de usar solo las mismas referencias para acceder a los valores que se usaron para colocar valores en el mapa.

Para demostrar el último punto:

Map<Object, String> m = new IdentityHashMap<>(); // Any keys, we keep their references Object[] keys = { "strkey", new Object(), new Integer(1234567) }; for (int i = 0; i < keys.length; i++) m.put(keys[i], "Key #" + i); // We query values from map by the same references: for (Object key : keys) System.out.println(key + ": " + m.get(key));

La salida será, como se esperaba (porque usamos las mismas referencias de Object para consultar los valores del mapa):

strkey: Key #0 java.lang.Object@1c29bfd: Key #1 1234567: Key #2


Un caso en el que puede usar IdentityHashMap es si sus claves son objetos de clase. ¡Esto es aproximadamente un 33% más rápido que HashMap para get! Probablemente usa menos memoria también.


Un caso importante es cuando se trata de tipos de referencia (en lugar de valores) y realmente desea el resultado correcto. Los objetos malintencionados pueden tener hashCode anulados e equals métodos para hacer frente a todo tipo de travesuras. Desafortunadamente, no se usa con la frecuencia que debería. Si los tipos de interfaz con los que está tratando no anulan el hashCode y son equals , por lo general debería ir a IdentityHashMap .