Map.clear () vs new Map: ¿Cuál será mejor?

Tengo un mapa como syntax como Map testMap = new HashMap(); . En este mapa puede haber 1000 datos.

Cuando mi aplicación requiera una nueva lista de datos, entonces debo borrar el mapa. Pero cuando vi el código de Map.clear () como

 /** * Removes all of the mappings from this map. * The map will be empty after this call returns. */ public void clear() { modCount++; Entry[] tab = table; for (int i = 0; i < tab.length; i++) tab[i] = null; size = 0; } 

Me doy cuenta de que el método claro va en bucle durante n veces (donde n es el número de datos en el mapa). Así que pensé que podría haber una manera de redefinir ese mapa como testMap = new HashMap(); y el mapa utilizado anteriormente será basura recolectada.

Pero no estoy seguro de que sea una buena manera. Estoy trabajando en la aplicación móvil.

¿Puedes por favor guiarme?

Pregunta complicada Veamos qué pasa.

Crea una instancia nueva, que está respaldada con una nueva matriz. Por lo tanto, el recolector de basura debe borrar todas las claves y valores del mapa anterior y borrar la referencia a sí mismo. Entonces, el algoritmo O (n) se ejecuta de todos modos, pero en el hilo del recolector de basura. Para 1000 registros, no verá ninguna diferencia. PERO. La guía de rendimiento le dice que siempre es mejor no crear objetos nuevos , si puede. Así que iría con el método clear() .

De todos modos, prueba ambas variantes y trata de medir. ¡Siempre mida!

Cuando dice Map.clear() en un Mapa de tamaño n … Le está pidiendo al GC que limpie 2*n (Key & Value) objetos. Cuando dice null en el mismo mapa, le está pidiendo al GC que limpie 2*n+1 (1 para el propio mapa) objetos. Luego, tendrá que crear una nueva instancia de Map y otra sobrecarga. Así que vaya por Map.clear() . Será prudente preestablecer el tamaño del mapa al crear una instancia.

Pensé que crear objetos en Java era más costoso en términos de memoria, por lo que es mejor ir con .clear() , por lo que está usando el mismo objeto en lugar de crear uno nuevo

La idea de tener el método clear () es eliminar las referencias a otros objetos del mapa, de modo que las claves / valores no se retengan de gcing si el “mapa está referenciado en otro lugar”.

Pero si su mapa es un mapa local solo utilizado por su código específico (es decir, “el mapa no está referenciado en otro lugar”), siga adelante y use un nuevo mapa, pero establecer 1000 referencias a nulo no será un gran golpe de rendimiento de todas formas.

El map.clear () que eliminará todos los datos. Tenga en cuenta que esto solo descartará todas las entradas, pero mantendrá la matriz interna utilizada para almacenar las entradas en el mismo tamaño (en lugar de reducir a una capacidad inicial). Si también necesita eliminar eso, la manera más fácil sería descartar todo el HashMap y reemplazarlo con una nueva instancia. Eso, por supuesto, solo funciona si controlas quién tiene un puntero al mapa.

En cuanto a reclamar la memoria, tendrá que dejar que el recolector de basura haga su trabajo.

¿Tus valores también son largos? En este caso, es posible que desee ver una implementación más eficiente (memoria) que el HashMap genérico, como TLongLongHashMap que se encuentra en la biblioteca GNU Trove . Eso debería ahorrar mucha memoria.

Creo que llamar a HashMap () nuevo es una mejor idea ya que no tendrá que procesar tanto como borrar el hashmap. Además, al crear un nuevo hashmap, está eliminando la posibilidad de que el hashmap aún esté enlazado al control que usa los datos, lo que causaría problemas cuando se borre el hashmap.

no olvides la repoblación del mapa

si no especificas la capacidad en el nuevo mapa obtendrás bastante sobrecarga en el mapa recién creado debido a los refrijos (que cada uno es O (n) (en ese momento) y suceden O (log (n)) veces, mientras que esto podría amortizarse a O (n) en total, pero si no suceden en primer lugar, usted todavía será mejor de)

esto no sucederá con el mapa despejado porque la capacidad no cambia