ejemplo - ¿Cómo obtener la capacidad del ArrayList en Java?
sort arraylist java (9)
Acabo de revisar la documentación de sun en la clase ArrayList , y el único método que vi que estaba relacionado con la capacidad fue garantizar la capacidad (int minCapacity), que no es exactamente lo que desea. ¡Buena suerte!
Se sabe que Java ArrayList se implementa utilizando arreglos, se inicializa con una capacidad de 10 y aumenta su tamaño en un 50%. Cómo obtener la capacidad actual de ArrayList no el tamaño de ArrayList.
Gracias
El objetivo de usar ArrayList es agregar dinámicamente un elemento nuevo, por lo que no hay un método específico para obtener la capacidad de ArrayList.
Cada vez que agregamos un elemento, se produce una reasignación dinámica y, dado que la reasignación es costosa en términos de tiempo, evitar la reasignación mejora el rendimiento y, por lo tanto, puede aumentar manualmente la capacidad de ArrayList llamando a garantizarCapacity (), pero nuevamente no puede descubrir la capacidad de ArrayList. .
En cuanto a las especificaciones de ArrayList, no veo ningún método que proporcione esta información.
Dicho esto, el método ensureCapacity la ensureCapacity parece ser un paso en la dirección correcta (precaución: no garantiza una respuesta correcta ): cuando se le llama, garantiza que la capacidad sea al menos el argumento especificado. Por lo tanto, si la implementación de ArrayList
usa este método para garantizar la capacidad (en lugar de llamar a algún método privado / manipular los campos relevantes directamente), puede obtener la capacidad actual al reemplazar este método. También debe anular trimToSize()
de una manera similar.
Por supuesto, esta solución no es muy portátil, ya que una implementación diferente de ArrayList
(en una JVM de otro proveedor) puede hacer las cosas de manera diferente.
Así es como debería verse el código
public class CapacityTrackingArrayList<T> extends ArrayList<T> {
// declare a constructor for each ArrayList constructor ...
// Now, capacity tracking stuff:
private int currentCapacity = 10;
public int getCapacity() { return currentCapacity; }
public void ensureCapacity(int arg) {
currentCapacity = arg;
super.ensureCapacity(arg);
}
public void trimToSize() { currentCapacity = size(); super.trimToSize(); }
}
La capacidad predeterminada de ArrayList
es 10. una vez que se alcanza el tamaño máximo, la nueva capacidad será:
nueva capacidad = (capacidad actual * 3/2) +1.
No creo que esto sea posible. ¿Cuál es tu caso de uso? Creo que C # ArrayLists tiene una propiedad .capacity, pero la clase de Java ArrayList no expone esta información.
Tiene el constructor que toma un argumento de capacidad inicial, y tiene el método asegúrese de capacidad () que podría usar para reducir la cantidad de reasignación incremental.
También tiene el método trimToSize () que puede usar si está realmente preocupado por el uso de la memoria.
No recuerde si lo ha hecho, pero puede hacerlo usted mismo mirando el código fuente de ArrayList. Los desarrolladores de Java deben aprovechar el código fuente incluido con el SDK.
Puede obtener la capacidad actual de un ArrayList en Java utilizando la reflexión . Aquí hay un ejemplo:
package examples1;
import java.util.ArrayList;
import java.util.List;
import java.lang.reflect.Field;
public class Numbers {
public static void main(String[] args) throws Exception {
List<Integer> numbers = new ArrayList<>();
numbers.add(1);
System.out.println(getCapacity(numbers));
}
static int getCapacity(List al) throws Exception {
Field field = ArrayList.class.getDeclaredField("elementData");
field.setAccessible(true);
return ((Object[]) field.get(al)).length;
}
}
Esto dará salida: 10
Notas:
-
getCapacity()
modificado del original en http://javaonlineguide.net/2015/08/find-capacity-of-an-arraylist-in-java-size-vs-capacity-in-java-list-example.html - Tenga en cuenta que la capacidad predeterminada de 10 se otorga después de la primera adición a la lista. Si intenta esto antes de agregar, obtendrá una salida de
0
Para forzar una capacidad sin agregar, pásala en el constructor así:
List<Integer> numbers = new ArrayList<>(20);
Puedes conseguirlo por reflexión:
public abstract class ArrayListHelper {
static final Field field;
static {
try {
field = ArrayList.class.getDeclaredField("elementData");
field.setAccessible(true);
} catch (Exception e) {
throw new ExceptionInInitializerError(e);
}
}
@SuppressWarnings("unchecked")
public static <E> int getArrayListCapacity(ArrayList<E> arrayList) {
try {
final E[] elementData = (E[]) field.get(arrayList);
return elementData.length;
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}
Puedes usar Vector en lugar de ArrayList. Vector soporta el método de capacidad ().