java - how - Capacidad de ArrayList
list arraylist java (8)
¿Necesita esto en tiempo de ejecución o está bien obtener mientras se realizan las pruebas? Si está probando, normalmente puede ver la capacidad usando su depurador IDE favorito. No tengo el número exacto, pero 1.7 es generalmente el tamaño de crecimiento de la capacidad. Entonces, si creas un arraylist con 10 elementos, java lo convertirá en el tamaño 17.
Posible duplicado:
¿Cómo obtener la capacidad de ArrayList en Java?
¿Cómo encontrar la capacidad de un ArrayList
?
La API no lo proporciona. Internamente, la capacidad se multiplica por un factor cada vez que se llama add (..) mientras está en plena capacidad. Sin embargo, la especificación de Java no dice nada acerca de este factor constante ... La implementación de Sun usa un factor de 1.5, por lo que tiene un límite superior de 1.5 * tamaño () para la capacidad.
Recuerde que puede usar trimToSize () para "compactar" la lista y hacer que la capacidad sea igual a size ().
No necesita preocuparse por la capacidad, es un detalle de implementación interna. Si el conjunto interno se llena, se expandirá. Puede averiguar cuántos elementos hay actualmente en su ArrayList con el método size()
.
No, no puedes ! Java ArrayList no proporciona una forma de acceder a su capacidad actual.
Solo puede construir una ArrayList especificando una capacidad inicial usando el constructor ArrayList (int initialCapacity) o aumentar la capacidad llamando a ensureCapacity() .
Según la especificación: "La capacidad es el tamaño de la matriz utilizada para almacenar los elementos en la lista. Siempre es al menos tan grande como el tamaño de la lista. Cuando los elementos se agregan a una ArrayList, su capacidad aumenta automáticamente. la política de crecimiento no se especifica más allá del hecho de que agregar un elemento tiene un costo de tiempo amortizado constante ".
Entonces no hay forma de saber cuál es la capacidad actual, ni cómo crece.
Tengo curiosidad, ¿para qué lo necesitas? Debe saber que la capacidad no es (como puede parecer) un límite superior de cuánto puede poner en ArrayList . Es un valor que representa la cantidad de datos que puede poner en la lista, sin forzarlo a reasignar su matriz interna. Básicamente, la noción de capacidad solo está ahí para poder modificar ligeramente el rendimiento.
De todos modos, tal vez ya lo sabes, así que aquí viene la respuesta real.
La interfaz proporcionada por API para ArrayList simplemente no admite dicho caso de uso . Hay muchas razones para esto. Una razón es que no deberías preocuparte por esto. ArrayList debe considerarse como una matriz ilimitada que se abstrae de detalles como la capacidad.
Lo más cerca que puede llegar a controlar la capacidad es a través del constructor ArrayList(int initialCapacity)
, y los dos métodos trimToSize()
y ensureCapacity(int minCapacity)
.
Sin embargo, para divertirme, logré resolverlo a través de un feo truco de reflexión (no use esto):
import java.lang.reflect.Field;
import java.util.ArrayList;
public class Test {
public static void main(String[] args) throws Exception {
ArrayList<Integer> list = new ArrayList<Integer>(3);
for (int i = 0; i < 17; i++) {
list.add(i);
System.out.format("Size: %2d, Capacity: %2d%n",
list.size(), getCapacity(list));
}
}
static int getCapacity(ArrayList<?> l) throws Exception {
Field dataField = ArrayList.class.getDeclaredField("elementData");
dataField.setAccessible(true);
return ((Object[]) dataField.get(l)).length;
}
}
Salida:
Size: 1, Capacity: 3
Size: 2, Capacity: 3
Size: 3, Capacity: 3
Size: 4, Capacity: 5
Size: 5, Capacity: 5
Size: 6, Capacity: 8
Size: 7, Capacity: 8
Size: 8, Capacity: 8
Size: 9, Capacity: 13
Size: 10, Capacity: 13
Size: 11, Capacity: 13
Size: 12, Capacity: 13
Size: 13, Capacity: 13
Size: 14, Capacity: 20
Size: 15, Capacity: 20
Size: 16, Capacity: 20
Size: 17, Capacity: 20
Voy a cambiar la tendencia aquí ... el usuario tiene una pregunta, aunque sin contexto. Sin contexto, conocer la capacidad es innecesario ya que la matriz de respaldo crecerá para acomodar ...
Puede hacer lo siguiente para saber con certeza cuál es la capacidad de ArrayList. El efecto secundario es que la matriz de respaldo se recortará al número exacto de elementos en la matriz:
ArrayList list = new ArrayList();
//add a bunch of elements
list.trimToSize();
System.out.println("Capacity = " + list.size());
¡Disfrutar!
ArrayList
es una abstracción para una List
de elementos que se puede crecer automáticamente. Raramente necesita conocer su capacidad. Considere la efectividad de la segunda edición de Java, artículo 52: consulte los objetos por sus interfaces . Tanto como sea práctico, ni siquiera debería importar si es una ArrayList
o una LinkedList
; es solo una List
.
Dicho esto, estos métodos pueden ser de su interés:
-
ArrayList(int initialCapacity)
- Construye una lista vacía con la capacidad inicial especificada.
-
void ensureCapacity(int minCapacity)
- Aumenta la capacidad de esta instancia de
ArrayList
, si es necesario, para garantizar que pueda contener al menos la cantidad de elementos especificada por el argumento de capacidad mínima.
- Aumenta la capacidad de esta instancia de
-
void trimToSize()
- Recorta la capacidad de esta instancia de
ArrayList
para ser el tamaño actual de la lista. Una aplicación puede usar esta operación para minimizar el almacenamiento de una instancia deArrayList
.
- Recorta la capacidad de esta instancia de