Pregunta

Tengo una ArrayList<String> que me gustaría volver una copia de. ArrayList tiene un clon método que tiene la siguiente firma:

public Object clone()

Después de que me llame a este método, ¿cómo convertir el Objeto devuelto de nuevo a ArrayList<String>?

¿Fue útil?

Solución

ArrayList newArrayList = (ArrayList) oldArrayList.clone();

Otros consejos

¿Por qué quieres clonar?La creación de una nueva lista normalmente tiene más sentido.

List<String> strs;
...
List<String> newStrs = new ArrayList<>(strs);

Trabajo hecho.

Este es el código que uso para el que:

ArrayList copy = new ArrayList (original.size());
Collections.copy(copy, original);

La esperanza es útil para usted

Con Java 8 puede ser clonado con un arroyo.

import static java.util.stream.Collectors.toList;

...

List<AnObject> clone = myList.stream().collect(toList());

Se aconseja que el Objeto.clone() tiene algunos de los principales problemas, y su uso se recomienda en la mayoría de los casos.Por favor, véase el Punto 11, de la "Efectivos De Java"por Joshua Bloch para obtener una respuesta completa.Yo creo que se puede utilizar de forma segura Objeto.clone() de tipo primitivo de las matrices, pero aparte de que usted debe ser juicioso sobre el uso correcto y primordial clon.Usted es probablemente mejor de la definición de un constructor de copia o estático de un método de fábrica que explícitamente clones de los objetos de acuerdo a su semántica.

Creo que debería hacer el truco de usar la API de Colecciones:

Nota:el método de copia se ejecuta en tiempo lineal.

//assume oldList exists and has data in it.
List<String> newList = new ArrayList<String>();
Collections.copy(newList, oldList);

Creo que utilizando addAll funciona bien.

ArrayList<String> copy = new ArrayList<String>();
copy.addAll(original);

los paréntesis se usan en lugar de los genéricos de la sintaxis

Si quieres que este con el fin de ser capaz de devolver la Lista en un getter sería mejor hacer:

ImmutableList.copyOf(list);

Para clonar una interfaz genérica como java.util.List usted sólo tendrá que echarlo.aquí tienes un ejemplo:

List list = new ArrayList();
List list2 = ((List) ( (ArrayList) list).clone());

Es un poco complicado, pero funciona, si usted se limita a devolver un List la interfaz, por lo que cualquier persona después de que usted puede aplicar a su lista cada vez que quiere.

Sé que esta respuesta se acerca a la respuesta final, pero mi respuesta respuestas de cómo hacer todo eso mientras se está trabajando con List -el genérico de los padres - no ArrayList

Ser muy cuidadoso a la hora de clonación ArrayLists.La clonación en java es poco profunda.Esto significa que sólo clonar el Arraylist en sí y no a sus miembros.Así que si usted tiene un ArrayList X1 y clonarlo en X2 cualquier cambio en X2 se manifiesta también en X1 y vice-versa.Al clonar usted sólo va a generar un nuevo objeto ArrayList con los punteros a la misma los elementos de la original.

También debería funcionar:

ArrayList<String> orig = new ArrayList<String>();
ArrayList<String> copy = (ArrayList<String>) orig.clone()
ArrayList first = new ArrayList ();
ArrayList copy = (ArrayList) first.clone ();

Yo no soy un java profesional, pero tengo el mismo problema y he intentado resolver por este método.(Es de suponer que T tiene un constructor de copia).

 public static <T extends Object> List<T> clone(List<T> list) {
      try {
           List<T> c = list.getClass().newInstance();
           for(T t: list) {
             T copy = (T) t.getClass().getDeclaredConstructor(t.getclass()).newInstance(t);
             c.add(copy);
           }
           return c;
      } catch(Exception e) {
           throw new RuntimeException("List cloning unsupported",e);
      }
}
List<String> shallowClonedList = new ArrayList<>(listOfStrings);

Tenga en cuenta que esto es sólo un poco no una copia en profundidad, es decir,.usted obtener una lista nueva, pero las entradas son las mismas.Esto no es ningún problema para simplemente cadenas.Obtenga más difícil cuando las entradas de la lista son objetos en sí mismos.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top