Tengo un ArrayList
y quiero copiarlo exactamente. Utilizo las clases de utilidad cuando es posible, asumiendo que alguien ha dedicado algo de tiempo a hacerlo correctamente. Así que, naturalmente, termino con la clase Collections
que contiene un método de copia.
Supongamos que tengo lo siguiente:
List<String> a = new ArrayList<String>();
a.add("a");
a.add("b");
a.add("c");
List<String> b = new ArrayList<String>(a.size());
Collections.copy(b,a);
Esto falla porque básicamente piensa que "b" no es lo suficientemente grande para contener "a". Sí, ya sé que b
tiene tamaño 0, pero debería ser lo suficientemente grande, ¿no? Si tengo que llenar b
primero, entonces Collections.copy()
se convierte en una función completamente inútil en mi opinión. Así que, salvo programar una función de copia (que voy a hacer ahora), ¿hay alguna forma adecuada de hacer esto?
btiene una *capacidad* de 3, pero un *tamaño* de 0. El hecho de que
ArrayListtenga algún tipo de capacidad de buffer es un detalle de implementación - no forma parte de la interfaz
List, por lo que
Collections.copy(List, List)no la utiliza. Sería feo que el caso especial de
ArrayList`.
Como ha indicado MrWiggles, utilizar el constructor ArrayList que toma una colección es la forma de hacerlo en el ejemplo proporcionado.
Para escenarios más complicados (que bien pueden incluir tu código real), puedes encontrar útiles las colecciones dentro de Guava.
la forma más sencilla de copiar una lista es pasarla al constructor de la nueva lista:
List<String> b = new ArrayList<>(a);
b
será una copia superficial de a
.
Mirando la fuente de Collections.copy(List,List)
(nunca lo había visto antes) parece que es para copiar los elementos índice por índice. usando List.set(int,E)
así el elemento 0 sobreescribirá el elemento 0 en la lista de destino etc etc. No está especialmente claro en los javadocs tengo que admitir.
List<String> a = new ArrayList<>(a);
a.add("foo");
b.add("bar");
List<String> b = new ArrayList<>(a); // shallow copy 'a'
// the following will all hold
assert a.get(0) == b.get(0);
assert a.get(1) == b.get(1);
assert a.equals(b);
assert a != b; // 'a' is not the same object as 'b'