2010-11-13 13 views

Respuesta

31

¡Es la capacidad inicial, es decir, el número de elementos que ArrayList asignará para comenzar como el almacenamiento interno de los artículos.

ArrayList puede contener "cualquier cantidad de elementos" (siempre que tenga la memoria) y al realizar inserciones iniciales grandes puede indicar ArrayList para asignar un almacenamiento más grande para no perder ciclos de CPU cuando intenta para asignar más espacio para el próximo artículo.

Ejemplo:

ArrayList list = new ArrayList<Integer>(2); 
list.add(1); // size() == 1 
list.add(2); // size() == 2, list is "filled" 
list.add(3); // size() == 3, list is expanded to make room for the third element 
+0

¿Qué significa esto? y cual es el beneficio de eso? –

+0

gr8 respuesta muchas gracias :), me encanta stackoverflow !!! –

+3

Objeto a la palabra "predeterminado" en la primera oración. El número * predeterminado * es el tamaño que se asigna si * no * pone un número entre paréntesis. –

7

En términos prácticos, es el número de elementos que se pueden agregar a la ArrayList antes de que se cambia el tamaño en el fondo, lo que le puede ahorrar algunos ciclos si se utiliza correctamente.

5

La capacidad es el tamaño del almacenamiento interno de los objetos. El almacenamiento interno siempre es mayor o igual que el tamaño() de la lista (para que pueda contener todos los elementos).

public class Main { 
    public static void main(String[] args) throws Exception { 

     ArrayList<Integer> arr = new ArrayList<>(); 
     System.out.println("initial size = " + arr.size()); // 0 
     System.out.println("initial capacity = " + getCapacity(arr)); 

     for (int i = 0; i < 11; i++) 
      arr.add(i); 

     System.out.println("size = " + arr.size()); // 11 
     System.out.println("capacity = " + getCapacity(arr)); 
    } 

    static int getCapacity(ArrayList<?> l) throws Exception { 
     Field dataField = ArrayList.class.getDeclaredField("elementData"); 
     dataField.setAccessible(true); 
     return ((Object[]) dataField.get(l)).length; 
    } 
} 

La ejecución de este da:

initial size = 0 
initial capacity = 10 
size = 11 
capacity = 16 
2

Bajo el capó, ArrayList es esencialmente un dynamic array. Cada vez que se ejemplariza mediante new Arraylist<>() lo que está sucediendo es que se crea una matriz para contener los valores que desee almacenar cuya capacidad, not to be confused with size por defecto, es de 10.

cada vez que se agrega un valor que aumentaría el tamaño más allá de la capacidad de un nuevo se crea una matriz cuya capacidad es una más de 150% de la capacidad anterior con los contenidos de la matriz anterior copiada dentro.

Si tiene una idea general del tamaño de la lista resultante, o es cierto pero desea la flexibilidad que ofrece el uso de matrices en matrices, puede establecer la capacidad para evitar este proceso repetitivo de crear nuevas matrices, copiar el contenido de la matriz anterior en la nueva, y deshacerse de la anterior, que de lo contrario aumentará en las apariciones proporcionales al tamaño de la lista.

Cuestiones relacionadas