Aunque las respuestas que proponen usar ArrayList tienen sentido en la mayoría de los escenarios, la pregunta real sobre el rendimiento relativo no ha sido respondida realmente.
Hay algunas cosas que puede hacer con una matriz:
- crearlo
- establecer un elemento
- obtener un artículo
- clonar / copiar
Conclusión general
Aunque las operaciones get y set son algo más lentas en una ArrayList (resp. 1 y 3 nanosegundos por llamada en mi máquina), hay muy poca sobrecarga de usar una ArrayList frente a una matriz para cualquier uso no intensivo. Sin embargo, hay algunas cosas a tener en cuenta:
- cambiar el tamaño de las operaciones en una lista (cuando se llama
list.add(...)
) es costoso y uno debe intentar establecer la capacidad inicial en un nivel adecuado cuando sea posible (tenga en cuenta que surge el mismo problema cuando se usa una matriz)
- Cuando se trata de primitivas, las matrices pueden ser significativamente más rápidas ya que permitirán evitar muchas conversiones de boxeo / unboxing
- una aplicación que solo obtiene / establece valores en una ArrayList (¡no es muy común!) podría ver una ganancia de rendimiento de más del 25% al cambiar a una matriz
Resultados detallados
Aquí están los resultados que midí para esas tres operaciones usando la biblioteca de evaluación comparativa jmh (veces en nanosegundos) con JDK 7 en una máquina de escritorio estándar x86. Tenga en cuenta que ArrayList nunca cambia de tamaño en las pruebas para asegurarse de que los resultados sean comparables. Código de referencia disponible aquí .
Creación de Array / ArrayList
Ejecuté 4 pruebas, ejecutando las siguientes declaraciones:
- createArray1:
Integer[] array = new Integer[1];
- createList1:
List<Integer> list = new ArrayList<> (1);
- createArray10000:
Integer[] array = new Integer[10000];
- createList10000:
List<Integer> list = new ArrayList<> (10000);
Resultados (en nanosegundos por llamada, 95% de confianza):
a.p.g.a.ArrayVsList.CreateArray1 [10.933, 11.097]
a.p.g.a.ArrayVsList.CreateList1 [10.799, 11.046]
a.p.g.a.ArrayVsList.CreateArray10000 [394.899, 404.034]
a.p.g.a.ArrayVsList.CreateList10000 [396.706, 401.266]
Conclusión: no hay diferencia notable .
obtener operaciones
Ejecuté 2 pruebas, ejecutando las siguientes declaraciones:
- getList:
return list.get(0);
- getArray:
return array[0];
Resultados (en nanosegundos por llamada, 95% de confianza):
a.p.g.a.ArrayVsList.getArray [2.958, 2.984]
a.p.g.a.ArrayVsList.getList [3.841, 3.874]
Conclusión: obtener de una matriz es aproximadamente un 25% más rápido que obtener de una ArrayList, aunque la diferencia es solo del orden de un nanosegundo.
establecer operaciones
Ejecuté 2 pruebas, ejecutando las siguientes declaraciones:
- setList:
list.set(0, value);
- setArray:
array[0] = value;
Resultados (en nanosegundos por llamada):
a.p.g.a.ArrayVsList.setArray [4.201, 4.236]
a.p.g.a.ArrayVsList.setList [6.783, 6.877]
Conclusión: las operaciones de configuración en las matrices son aproximadamente un 40% más rápidas que en las listas, pero, en cuanto a get, cada operación de configuración requiere unos pocos nanosegundos, por lo que para que la diferencia llegue a 1 segundo, sería necesario establecer elementos en la lista / matriz cientos de millones de veces!
clonar / copiar
El constructor de copias de ArrayList delega para Arrays.copyOf
que el rendimiento sea idéntico a la copia de la matriz (copiar una matriz a través de clone
, Arrays.copyOf
o System.arrayCopy
no hace diferencia material en cuanto al rendimiento ).