2011-06-07 13 views
8

Quiero ser claro en algo: Al usar un arraylist, comienza con un tamaño de 10 elementos. Si necesita aumentar automáticamente, reescribe todo el arrayList para que sea 2/3 más grande.ArrayList Eficiencia y tamaño

Si estoy buscando a una lista que finalmente será el tamaño 50-120, ¿es mejor:

  1. crearlo tamaño 150 justo al lado y tienen un montón de espacio no utilizado
  2. permiten la lista para ser auto-aumentado un par de veces?

Gracias

+2

A menos que hayas perfilado tu código y este sea un cuello de botella, no me importaría especificar el tamaño inicial. Esos números son muy pequeños. – gpeche

Respuesta

10

Si conoce el tamaño final probable de la ArrayList, por lo general es mejor que lo especifique por adelantado:

ArrayList myList = new ArrayList(150); 

Esto le ahorra el impacto en el rendimiento de tener ArrayList reasignar el matriz utilizada para almacenar su contenido (aunque, para el tamaño de matriz que ha especificado, este impacto será insignificante).

+0

Pero el posible tamaño final es * no * realmente conocido aquí. Tenga en cuenta, por ejemplo, que el 90% de los casos solo requerirá 50 elementos, y solo el 5% requerirá 120. –

+0

Cierto, pero la optimización sin datos reales siempre es conjetura, por eso no suele recomendarse. –

1

reescribe todo el arrayList para ser 2/3 más grande

No. Esto hace que la matriz dos veces tan grande (aunque el factor exacto es un detalle de implementación indocumentado). Soy corregido.

Si estoy buscando a una lista que finalmente será el tamaño 50-120, ¿es mejor: 1. Cree que el tamaño de la derecha de 150

Por qué 150? ¿Por qué no 120?

  1. permiten que la lista que se auto-incrementa un par de veces?

En una pequeña gama tan Me gustaría utilizar el gran tamaño de inmediato. Si el lapso fuera mucho mayor (por ejemplo, 50-50000), reservaría el tamaño más pequeño (o tal vez un tamaño intermedio, según la distribución del valor esperado) y lo dejaría cambiar de tamaño varias veces.

+1

¿Estás seguro de tu primer punto? (No tengo la fuente a mano) – jjnguy

+0

@jjnguy No está especificado, pero esa es la implementación típica. - ** EDIT ** Y estaba equivocado. –

+0

* Los detalles de la política de crecimiento no se especifican más allá del hecho de que agregar un elemento tiene un costo constante de tiempo amortizado. * - 1.6 API – alexcoco

1

Si aproximadamente conoce el tamaño final, sería más eficiente crearlo en ese tamaño. Pero para un tamaño de lista de 150, esto parece una micro-optimización.

1

Mientras no planee crear millones de estas listas, realmente no importa. Copiar los datos de la matriz es bastante rápido y aumentar el tamaño para llegar a 50-120 elementos no será mensurable con un generador de perfiles. Sin embargo, si sabe que la lista finalmente tendrá este tamaño, le recomendaría utilizar esta información al crear la lista.

2

Sí, especificar el tamaño antes de la mano es mejor, debido al auto-tamaño. Cuanto más grande sea el ArrayList, más tendrá que redimensionarse.

4

Es menos intensivo desde el punto de vista informático para que sea tan grande como sea necesario, pero la verdad es que Java es muy eficiente, por lo que no es necesario preocuparse por cómo se aumenta el arraylist. Sin embargo, si está buscando la máxima eficiencia, entonces sí, asignar la memoria cuando crea la lista es mejor.

1

También puede usar un buen método de Guava Lists.newArrayListWithExpectedSize.

Aquí es el javadoc

crea una instancia ArrayList tamaño adecuado para contener un número estimado de elementos sin cambiar el tamaño. Se agrega una pequeña cantidad de relleno en caso de que la estimación sea baja.

Cuestiones relacionadas