Declaración de la capacidad de una lista en Java

A menudo uso Listas en mis aplicaciones de Android. Ahora mismo estoy creando una página de Twitter que lista un máximo de 50 "tweets" de un usuario.

Tengo una lista definida así:

List<Tweet> tweets = new ArrayList<Tweet>(MAX_TWEETS);

Donde Tweet es un tipo de objeto personalizado que contiene información de actualización de twitter (texto, fecha, nombre de usuario, etc.) y MAX_TWEETS es un valor entero constante (50).

Preguntas:

¿Cuál es el beneficio de establecer la capacidad inicial de esta List , si la hay?

¿Debería molestarme en establecer una capacidad cuando sé que mi lista será tan pequeña? ¿Cuándo debería / no debo establecer una capacidad?

La capacidad por defecto de ArrayList está establecida en 10 (ver fuente jdk 1.6). Esto significa que la matriz de tamaño 10 será asignada en la creación. Si va a agregar el elemento número 11, la capacidad aumentará a 16. A continuación, aumentar de nuevo una vez que llegue a 21.

Si no esperas más de 50 elementos, la matriz cambiará de tamaño como máximo 3 veces. Dado ese pequeño número, realmente no importa mucho. Establecer a 50 si le da un poco de la mente de ahorro en la copia de la matriz.

En realidad esta es la fórmula correcta de aumentar el tamaño:

 int newCapacity = (oldCapacity * 3)/2 + 1; 

Establecer la capacidad inicial puede aumentar el rendimiento al poblar la lista y también puede reducir la huella de memoria de la lista si nunca agrega más de ese número de elementos a la lista.

La huella de memoria de una lista que ha crecido y puede tener una matriz de respaldo que es mayor que el número de elementos almacenados se puede reducir invocando trimToSize()

De forma predeterminada, en Java 6, el tamaño de una lista es 10. Es decir, el sistema crea diez ranuras de memoria en la matriz subyacente. Si intenta agregar el elemento 11, sólo se crea la copia Array. Proporcionar un tamaño mejora el rendimiento.

¿Cuál es el beneficio de establecer la capacidad inicial de esta Lista?

Se asignará la memoria de ese tamaño internamente y cuando crece más que se reasignar la memoria y lo hará. Si suministramos la capacidad inicial adecuada podemos tener algún ciclo de la CPU guardado mientras reajustamos los desbordamientos.

Establecer la capacidad de la lista sólo especificará cuán grande será. El único lado al lado de hacer esto será el hecho de que cuando u añadir elementos que exceden el tamaño predeterminado de una lista, no tendrá que ampliar la lista.

Ejemplo: se establece la lista a 25, y el valor predeterminado es 10? (No 100% seguro) si agrega 24 elementos que no tendrá que crecer la lista en absoluto. Si lo dejó como el valor predeterminado, lo crecerá.

espero que esto ayude

La capacidad inicial ayuda si usted sabe que necesitará exactamente esa cantidad. Se creará un contenedor que será capaz de referencia MAX_TWEETS elementos. Si lo superas, el sistema creará una nueva lista con el doble de elementos que copiar en la lista original (lo que es bastante común en las aplicaciones Java).

ArrayList, como su nombre sugiere, se implementa como una matriz (a diferencia de una lista vinculada). Al especificar el tamaño inicial, puede evitar tener que crecer la matriz al agregar elementos. Esta es una operación costosa, se debe crear una nueva matriz y, a continuación, copiar los elementos existentes. Por lo tanto, si conoce los valores máximos antes de tiempo, nunca debe tener que hacer esto.

En realidad, si el tamaño de la lista es 50 y sólo hay una instancia de esta matriz, la matriz sólo se ampliará unas cuantas veces, por lo que en este caso puede no importar. Sin embargo, su enfoque es bueno en caso de que cambie la variable más tarde.

Se asignará la memoria en la creación y no tendrá que copiar hasta que pasen por encima de eso.

Pero honestamente, con sólo 50 objetos, la copia no tendrá mucho esfuerzo de todos modos, por lo que dudo mucho que verá cualquier aumento en el rendimiento en absoluto. Pero, no hay ningún inconveniente en especificar el tamaño, por lo que también podría hacerlo.

  • Eclipse: adt no pudo instanciar la clase com.android.ide.eclipse.adt.internal.editors.common.CommonXmlEditor
  • Refrescar las vistas de las preferencias cuando se utiliza PreferenceActivity
  • Convertir una cadena en una clase de actividad
  • ¿Es más eficiente para convertir la cadena a Int o Int a la cadena al comprobar la igualdad?
  • Cómo codificar un símbolo de Euro en strings.xml en los archivos de android XML
  • Precisamente Sync Looped Audio con animación en Android
  • ¿Se garantiza que init estática NO se ejecute si no se accede a la clase?
  • ¿Es realmente imposible proteger las aplicaciones de Android de ingeniería inversa?
  • Fije una imagen de la galería para el fondo del teléfono de escritorio (androide-java)
  • Aplicación para Android que muestra diferentes diseños a la vez con hdmi
  • Android Touch UP no funciona
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.