Java tiene una capacidad de plantilla inadecuada. Mientras desee una matriz de objetos, entonces ArrayList<T>
es bueno. Para los primitivos, es horrible.
Suponiendo que haya una jerarquía de objetos que desea poner en una lista, ArrayList
es ideal:
ArrayList<Vehicle> vehicles = new ArrayList<Vehicle>();
vehicles.add(new Car(...));
vehicles.add(new Truck(...));
Asumo en el ejemplo anterior que vehículo es la clase base, y coches y camiones son subclases.
Por otro lado, si desea una lista de números, Java es muy ineficiente. Cada objeto es una referencia (realmente un puntero de 4 bytes) a un fragmento de memoria de 12 bytes, más lo que realmente está usando. Como ArrayList no puede aplicarse a int, esto significa que crear una lista de números significa:
- Creación de una lista de Entero, el contenedor de objetos para int.
- Convirtiendo los objetos cada vez que saca un número. Esto se hace automáticamente en estos días, pero lleva tiempo.
- Inicializando 5 veces más almacenamiento que el necesario.
Por lo tanto, si está manipulando grandes trozos de datos primitivos (int, float, double), puede valer la pena escribir su propia versión de ArrayList. Esto es particularmente importante cuando los datos son grandes y la plataforma es pequeña (como una cosa portátil de Android).
Compare esto:
ArrayList<Integer> list = new ArrayList<Integer>();
for (int i = 0; i < 1000000; i++)
list.add(i):
a:
public class IntArray {
private int[] data;
private int used;
private void grow() {
// implement code to make data double in size here...
}
public IntArray(int size) {
data = new int[size];
used = 0;
}
public void add(int i) {
if (i >= data.length) grow();
data[used++] = i;
}
}
IntArray list2 = new IntArray(1000000);
for (int i = 0; i < 1000000; i++)
list2.add(i);
La última vez que Benchmarked ella, el uso óptimo de la lista primitiva es más de 10 veces más rápido que el uso ciertamente subóptima de ArrayList . Para ser más justos, preasignar el arraylist para que tenga el tamaño correcto, aún es mucho más lento.
LinkedList solo vale la pena si está insertando al principio o al medio de una lista. Si su lista se está compilando al agregarla al final, ArrayList dominará completamente LinkedList. Entonces, para una lista típica de objetos que está construyendo en orden, ArrayList es lo que está buscando. Para obtener una gran lista de elementos primitivos como int o double, escriba su propia lista.
Eso es difícil de responder sin conocer los requisitos. Eche un vistazo a http://download.oracle.com/javase/tutorial/collections/index.html y vea cuál encaja en la factura. –
¿Por qué no usar los que están en la API, ArrayList por ejemplo? – dacwe