2010-09-29 8 views
26

Usando Java (1.6) ¿es mejor llamar al método clear() en una lista o simplemente volver a crear una instancia de la referencia?Mejor práctica para volver a crear una instancia de una lista o invocar clear()

Tengo una ArrayList que está llena de un número desconocido de Objetos y periódicamente "limpiado" - donde se procesan los Objetos y se borra la Lista. Una vez purgado, la Lista se completa nuevamente. El color ocurre en un momento aleatorio. El número dentro de la Lista puede ser potencialmente pequeño (10s de Objetos) o grande (millones de objetos).

Entonces, ¿es mejor tener la llamada "flush" clear() o nueva ArrayList()?

¿Vale la pena preocuparse por este tipo de problemas o debería dejar que el VM se preocupe por ello? ¿Cómo podría ir sobre la huella de memoria de Java para resolver este tipo de cosas por mí mismo?

Cualquier ayuda muy apreciada.

+0

Observe la respuesta de Jon con respecto a la parte de optimización: si se trata de alta intensidad y hay lentitud, perfile. Si el problema está en la claridad, entonces puede probar fácilmente cambiarlo para crear una nueva lista. De lo contrario, use lo que es semánticamente correcto, es decir, lo que el código realmente intenta hacer. – aperkins

+0

rendimiento relacionado: [map-clear-vs-new-map-which-one-will-be-better] (http://stackoverflow.com/questions/6757868/map-clear-vs-new-map-which- one-will-be-better) – nawfal

Respuesta

29

Lo principal que debe preocupar es qué otro código podría tener una referencia a la lista. Si la lista existente es visible en otro lugar, ¿desea que ese código vea una lista borrada, o mantenga la existente?

Si nada más puede ver la lista, probablemente lo borre, pero no por motivos de rendimiento; solo porque la forma en que describió la operación suena a más como borrar que como "crear una nueva lista".

Los ArrayList<T> documentos no especifican lo que sucede con las estructuras de datos subyacentes, pero mirando a la aplicación en Eclipse 1.7, parece que probablemente debería llamar trimToSize() después clear() - de lo contrario podría todavía tener una lista respaldado por un gran matriz de referencias nulas. (Tal vez eso no sea un problema para usted, por supuesto ... tal vez sea más eficiente que tener que copiar la matriz a medida que el tamaño se acumula nuevamente. Sabrá más acerca de esto que nosotros.)

(Por supuesto, crear una nueva lista no requiere que la lista anterior configure todos los elementos de la matriz como nulos ... pero dudo que eso sea significativo en la mayoría de los casos.)

+0

La visibilidad no es un problema.Me gusta su razonamiento para el método claro, ya que ayuda a describir lo que está sucediendo. Nunca antes había visto trimToSize(). Lo comprobaré – Phil

+0

Además, ¿te refieres a la "implementación 1.7"? Seguramente Eclipse no es compatible con Java 1.7 (ya que aún no ha salido) o lo he malinterpretado. – Phil

+0

@Phil: Estoy usando build 1.7.0-ea-b78. Es la única JVM en este sistema. A pesar de que no se ha lanzado, se han desarrollado durante mucho tiempo, y Eclipse se ejecuta sin problemas que he visto. –

1

Creo que si el Arraylist va a ser demasiado frecuentemente enrojecido, como si se ejecutara continuamente en bucle o algo así, mejor que lo uses claro si el lavado no es demasiado frecuente, entonces puedes crear una nueva instancia. También como dices que los elementos pueden variar de 10 a millones, probablemente puedas elegir un el tamaño intermedio para cada nuevo Arraylist que haya creado para que el arraylist pueda evitar cambiar el tamaño de un montón de tiempo.

2

La forma en que la usa se parece mucho a cómo se usa Queue. Cuando trabajas con los artículos en la cola, se eliminan cuando los tratas.

El uso de una de las clases Queue puede hacer que el código sea más elegante.

También hay variantes que manejan las actualizaciones simultáneas de una manera predecible.

Cuestiones relacionadas