2010-04-07 12 views
13

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()

+1

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

+0

Revisé la ventana emergente. No hubo nada relacionado con el rendimiento en términos de ArrayList iterator vs clone(). – tech20nn

Respuesta

9

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.

+0

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 v = (ArrayList ) super.clone(); v.elementData = Arrays.copyOf (elementData, size); v.modCount = 0; return v; } catch (CloneNotSupportedException e) { // esto no debería suceder, ya que somos Clonables throw new InternalError(); } } – tech20nn

+1

No me preocuparía mucho la eficacia. Usar clone() es un dolor; simplemente use el constructor de conversión como se sugiere. –

+2

@Kevin Bourrillion ¿por qué crees que usar 'clone()' es dolor? Implementar 'clone()' es doloroso, no usarlo. – Bozho

8

En lugar de iterar manualmente, puede usar el copy constructor.

En cuanto a la diferencia de velocidad entre eso y el uso de clone():

  1. No importa
  2. más probable es que no hay ninguno
  3. hacer un punto de referencia para su configuración específica del sistema y utilizar el caso
+0

@ 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 c) { elementData = c.toArray(); size = elementData.length; if (elementData.getClass()! = Object []. Class) elementData = Arrays.copyOf (elementData, size, Object []. Class); } – tech20nn

+0

Me gusta el universal "¿debo optimizar?" patrón de pensamiento –

-1

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?

+2

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

Cuestiones relacionadas