java - suggestions - tags for likes
Mejores prácticas para volver a crear una instancia de una lista o invocar clear() (4)
Creo que si el Arraylist se va a vaciar con demasiada frecuencia, como si se ejecuta continuamente en bucle o algo así, es mejor usarlo si el enrojecimiento no es demasiado frecuente, entonces puede crear una nueva instancia. Además, dice que los elementos pueden variar de 10 si se opone a millones, probablemente pueda elegir un tamaño intermedio para cada nuevo Arraylist que cree, de modo que el Arraylist pueda evitar cambiar el tamaño por mucho tiempo.
Usar Java (1.6) ¿es mejor llamar al método clear () en una Lista o simplemente volver a crear una instancia de la referencia?
Tengo una ArrayList que se llena con un número desconocido de Objetos y que se "vacía" periódicamente, donde se procesan los Objetos y se borra la Lista. Una vez lavada la lista se llena de nuevo. La descarga ocurre en un tiempo 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 el "flush" call clear () o new ArrayList ()?
¿Vale la pena preocuparse por este tipo de problemas o debo dejar que la VM se preocupe por eso? ¿Cómo podría analizar la huella de memoria de Java para resolver este tipo de cosas por mí mismo?
Cualquier ayuda muy apreciada.
La forma en que lo está utilizando se parece mucho a cómo se usa una Queue . Cuando trabaja con los elementos de la cola, se eliminan cuando los trata.
El uso de una de las clases de Cola puede hacer que el código sea más elegante.
También hay variantes que manejan actualizaciones concurrentes de una manera predecible.
Lo más importante de lo que debe preocuparse es de qué otro código podría tener una referencia a la lista. Si la lista existente está visible en otro lugar, ¿desea que el código vea una lista borrada o conserva la existente?
Si nada más puede ver la lista, es probable que simplemente la borre, pero no por motivos de rendimiento; solo porque la forma en que ha descrito la operación suena más como una limpieza que como "crear una nueva lista".
Los documentos ArrayList<T>
no especifican lo que sucede con las estructuras de datos subyacentes, pero al observar la implementación 1.7 en Eclipse, parece que probablemente debería llamar a trimToSize()
después de clear()
; de lo contrario, podría tener una lista respaldada. por una gran variedad 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 aumenta el tamaño. Usted sabrá más sobre esto que nosotros).
(Por supuesto, crear una nueva lista no requiere que la lista anterior establezca todos los elementos de la matriz en nulos ... pero dudo que eso sea significativo en la mayoría de los casos).
No hay ninguna ventaja para list.clear () que new XXList. Aquí está mi investigación para comparar el rendimiento.
import java.util.ArrayList;
import java.util.List;
public class ClearList {
public static void testClear(int m, int n) {
List<Integer> list = new ArrayList<>();
long start = System.currentTimeMillis();
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
list.add(Integer.parseInt("" + j + i));
}
list.clear();
}
System.out.println(System.currentTimeMillis() - start);
}
public static void testNewInit(int m, int n) {
List<Integer> list = new ArrayList<>();
long start = System.currentTimeMillis();
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
list.add(Integer.parseInt("" + j + i));
}
list = new ArrayList<>();
}
System.out.println(System.currentTimeMillis() - start);
}
public static void main(String[] args) {
System.out.println("clear ArrayList:");
testClear(991000, 100);
System.out.println("new ArrayList:");
testNewInit(991000, 100);
}
}
/*--*
* Out:
*
* clear ArrayList:
* 8391
* new ArrayList:
* 6871
*/