Saltar al contenido

Array o List en Java. ¿Cual es mas rápido?

Si encuentras algún fallo en tu código o proyecto, recuerda probar siempre en un ambiente de testing antes aplicar el código al trabajo final.

Solución:

Le sugiero que use un generador de perfiles para probar cuál es más rápido.

Mi opinión personal es que debería usar Listas.

Trabajo en una gran base de código y un grupo anterior de desarrolladores usaba matrices En todas partes. Hizo que el código fuera muy inflexible. Después de cambiar grandes porciones a Listas, no notamos ninguna diferencia en la velocidad.

La forma de Java es que debe considerar qué datos abstracción más se adapta a sus necesidades. Recuerde que en Java una lista es un tipo de datos abstracto, no concreto. Debe declarar las cadenas como una Lista y luego inicializarlas usando la implementación ArrayList.

List strings = new ArrayList();

Esta separación del tipo de datos abstracto y la implementación específica es una de las key aspectos de la programación orientada a objetos.

Un ArrayList implementa el tipo de datos abstracto de lista usando un array como su implementación subyacente. La velocidad de acceso es prácticamente idéntica a una array, con las ventajas adicionales de poder sumar y restar elementos a una Lista (aunque esta es una operación O (n) con una ArrayList) y que si decide cambiar la implementación subyacente más adelante, puede hacerlo. Por ejemplo, si se da cuenta de que necesita acceso sincronizado, puede cambiar la implementación a un Vector sin volver a escribir todo su código.

De hecho, ArrayList fue diseñado específicamente para reemplazar el bajo nivel array construir en la mayoría de los contextos. Si Java se estuviera diseñando hoy, es muy posible que las matrices se hubieran omitido por completo a favor de la construcción ArrayList.

Dado que las matrices mantienen todos los datos en una porción contigua de memoria (a diferencia de las listas), ¿el uso de una array almacenar miles de cadenas causa problemas?

En Java, todas las colecciones almacenan solo referencias a objetos, no los objetos en sí. Tanto las matrices como ArrayList almacenarán algunos miles de referencias en un array, por lo que son esencialmente idénticos. Puede considerar que un bloque contiguo de unos pocos miles de referencias de 32 bits siempre estará disponible en el hardware moderno. Esto no garantiza que no se quede sin memoria por completo, por supuesto, solo que el bloque contiguo de requisito de memoria no es difícil de cumplir.

Aunque las respuestas que proponen usar ArrayList tienen sentido en la mayoría de los escenarios, la pregunta real del rendimiento relativo no ha sido realmente respondida.

Hay algunas cosas que puede hacer con un array:

  • créalo
  • establecer un artículo
  • conseguir un artículo
  • clonarlo / copiarlo

Conclusión general

Aunque las operaciones get y set son algo más lentas en una ArrayList (respectivamente 1 y 3 nanosegundos por llamada en mi máquina), hay muy poca sobrecarga de usar una ArrayList frente a una array para cualquier uso no intensivo. Sin embargo, hay algunas cosas a tener en cuenta:

  • cambiar el tamaño de las operaciones en una lista (al llamar list.add(...)) son costosos y se debe intentar establecer la capacidad inicial en un nivel adecuado cuando sea posible (tenga en cuenta que el mismo problema surge cuando se utiliza un array)
  • 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 un ArrayList (¡no es muy común!) Podría ver una ganancia de rendimiento de más del 25% al ​​cambiar a un array

Resultados detallados

Estos son los resultados que medí para esas tres operaciones usando la biblioteca de evaluación comparativa jmh (tiempos en nanosegundos) con JDK 7 en una máquina de escritorio x86 estándar. 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 list = new ArrayList<> (1);
  • createArray10000: Integer[] array = new Integer[10000];
  • createList10000: List 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: ninguna diferencia notable.

conseguir 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: obteniendo de un array es aproximadamente un 25% más rápido que obtener de un 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 matrices son aproximadamente un 40% más rápidas que en las listas, pero, en cuanto a obtener, cada operación de conjunto toma unos pocos nanosegundos, por lo que para que la diferencia alcance 1 segundo, sería necesario establecer elementos en la lista /array cientos de millones de veces!

clonar / copiar

El constructor de copia de ArrayList delega a Arrays.copyOf por lo que el rendimiento es idéntico al array copiar (copiar un array vía clone, Arrays.copyOf o System.arrayCopy no hace ninguna diferencia material en cuanto al rendimiento).

Reseñas y calificaciones

Puedes proteger nuestra faena ejecutando un comentario o valorándolo te damos la bienvenida.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *