Necesito una copia superficial de un java ArrayList
, ¿debo usar clone()
o iterar sobre la lista original y copiar los elementos en el nuevo arrayList, que es más rápido?ArrayList copia superficial iterar o clonar()
Respuesta
Uso clone()
o bien utiliza el constructor de copia.
El constructor de copias realiza una transformación adicional de la colección pasada a la matriz, mientras que el método clone()
utiliza la matriz interna directamente.
Tenga en cuenta que clone()
devuelve Object
, por lo que tendrá que convertir a List
.
Exactamente miré el código fuente de java.util.ArrayList y encontré que el clon() usa Array.copyof, que sería mucho más eficiente que el bucle sobre el original Lista de arreglo. clon public Object() {try { @SuppressWarnings ("sin marcar") ArrayList
No me preocuparía mucho la eficacia. Usar clone() es un dolor; simplemente use el constructor de conversión como se sugiere. –
@Kevin Bourrillion ¿por qué crees que usar 'clone()' es dolor? Implementar 'clone()' es doloroso, no usarlo. – Bozho
No hay necesidad de iterar:
List original = ...
List shallowCopy = new ArrayList(original);
http://java.sun.com/javase/6/docs/api/java/util/ArrayList.html#ArrayList%28java.util.Collection%29
En lugar de iterar manualmente, puede usar el copy constructor.
En cuanto a la diferencia de velocidad entre eso y el uso de clone()
:
- No importa
- más probable es que no hay ninguno
- hacer un punto de referencia para su configuración específica del sistema y utilizar el caso
@ Michael..Gracias. Revisé el código para el constructor de copias. Tiene un paso adicional para devolver la estructura de matrices internas como lo mencionó Bozho. public ArrayList (Colección extends E> c) { elementData = c.toArray(); size = elementData.length; if (elementData.getClass()! = Object []. Class) elementData = Arrays.copyOf (elementData, size, Object []. Class); } – tech20nn
Me gusta el universal "¿debo optimizar?" patrón de pensamiento –
la pregunta dice shallowcopy no deepcopy.Copiar directamente la referencia de una referencia de arraylist a otra también funcionará correctamente.La copia profunda incluye copia individual elemento en arraylist.
ArrayList<Integer> list=new ArrayList<Integer>();
list.add(3);
ArrayList<Integer> list1=list; //shallow copy...
¿Hay algún problema en esto?
Esto está mal. Todo lo que hará es que habrá dos punteros a un objeto físico 'ArrayList' en la memoria. Agregar un 'Entero 'a una lista hace que el' Entero' aparezca también en la otra lista. Eso no es lo que queremos. Copia superficial hace que los objetos subyacentes compartan el mismo espacio de memoria, pero las listas tengan espacio de memoria separado. Por lo tanto, si modifica un 'Entero ', se modificará en ambas listas. Pero si agrega un 'Entero 'en una lista, no aparecerá en la otra. La copia profunda no reflejará ningún cambio en nada en la otra lista. – Antimonit
- 1. copia profunda vs copia superficial
- 2. std vector C++ - copia profunda o superficial
- 3. ¿SqlCommand.Clone() crea una copia profunda o una copia superficial?
- 4. clone(): ArrayList.clone() pensé hace una copia superficial
- 5. copia superficial de un hashset
- 6. Error al clonar git repositorio de "superficial"
- 7. ¿Scala AnyRef.clone realiza una copia superficial o profunda?
- 8. Comprender dict.copy() - superficial o profundo?
- 9. qué es una copia superficial de la matriz
- 10. ¿Cómo mejorarías esta clase de copia superficial?
- 11. Pregunta sobre copia superficial en C++
- 12. copia superficial de un mapa en Java
- 13. constructor de copia con el parámetro ArrayList
- 14. C: Haciendo una copia profunda de una estructura ... haciendo una copia superficial de una estructura
- 15. LinkedHashSet o ArrayList
- 16. Duplicar, clonar o copiar UIView
- 17. Modificación de Java ArrayList al iterar sobre ella
- 18. Error de copia conflictiva de Git al clonar un repositorio
- 19. Debo devolver List o ArrayList
- 20. Uso de ArrayList o HashMap
- 21. ¿Debo usar ArrayList o IList
- 22. C# clonar una pila
- 23. ¿Cómo hacer una copia de seguridad de ArrayList en Java?
- 24. ¿Cómo hacer una copia del objeto ArrayList que es tipo de lista?
- 25. ¿Cómo hago una copia superficial de una referencia de hash Perl?
- 26. Cómo clonar imagen?
- 27. ¿Existe un método genérico para clonar objetos CLOS?
- 28. Cómo clonar un iterador?
- 29. ArrayList o declaración de lista en Java
- 30. Java Vector o ArrayList for Primitives
Durante la introducción de la pregunta, debería haber visto aparecer una lista de preguntas relacionadas (la misma lista que ve en la columna inferior derecha de esta página). ¿Echas un vistazo en ellos? ¿Por qué esas respuestas no fueron suficientes? Por favor elabora. – BalusC
Revisé la ventana emergente. No hubo nada relacionado con el rendimiento en términos de ArrayList iterator vs clone(). – tech20nn