Tengo uno del ArrayList<String>
que me gustaría devolver una copia. ArrayList
tiene un método de clonación que tiene la siguiente firma:
public Object clone()
Después de llamar a este método, ¿cómo devuelvo el objeto devuelto ArrayList<String>
?
Respuestas:
fuente
ArrayList<String> newArrayList = (ArrayList<String>) oldArrayList.clone();
.List<String>
lugar deArrayList<String>
en el lado izquierdo. Así es como se deben usar las colecciones la mayor parte del tiempo.¿Por qué querrías clonar? Crear una nueva lista generalmente tiene más sentido.
Trabajo hecho.
fuente
ArrayList(Collection<? extends E> c)
significa que no importa qué tipo de lista uses como argumento.Este es el código que uso para eso:
La esperanza es útil para ti
fuente
ArrayList
usarlosArrayList<YourObject>
ArrayList
constructor?Con Java 8 se puede clonar con una secuencia.
...
fuente
toCollection
Puede ser una mejor opción.Tenga en cuenta que Object.clone () tiene algunos problemas importantes, y se desaconseja su uso en la mayoría de los casos. Consulte el Artículo 11, de " Java efectivo " de Joshua Bloch para obtener una respuesta completa. Creo que puede usar Object.clone () de forma segura en matrices de tipo primitivo, pero aparte de eso, debe ser prudente sobre el uso y la anulación del clon. Probablemente sea mejor definir un constructor de copias o un método de fábrica estático que clone explícitamente el objeto de acuerdo con su semántica.
fuente
Creo que esto debería hacer el truco usando la API de Colecciones:
Nota : el método de copia se ejecuta en tiempo lineal.
fuente
List<MySerializableObject> copyList = new ArrayList<>(mMySerializableObjects.size());
Parece que usarcopyList.addAll(original);
es una buena alternativaint
argumentos misteriosos . No tengo idea de por qué quieres usar este oscuro método estático en lugar de uno buenoaddAll
.Creo que usar addAll funciona bien.
se utilizan paréntesis en lugar de la sintaxis genérica
fuente
new ArrayList<String>(original)
?Si desea esto para poder devolver la Lista en un captador, sería mejor hacerlo:
fuente
Para clonar una interfaz genérica como la
java.util.List
que necesita, solo deberá lanzarla. Aquí tienes un ejemplo:Es un poco complicado, pero funciona si está limitado a devolver un
List
interfaz, por lo que cualquier persona después de usted puede implementar su lista cuando lo desee.Sé que esta respuesta está cerca de la respuesta final, pero mi respuesta responde cómo hacer todo eso mientras estás trabajando con
List
el padre genérico.ArrayList
fuente
Tenga mucho cuidado al clonar ArrayLists. La clonación en java es poco profunda. Esto significa que solo clonará el Arraylist y no sus miembros. Entonces, si tiene una ArrayList X1 y la clona en X2, cualquier cambio en X2 también se manifestará en X1 y viceversa. Cuando clones solo generarás una nueva ArrayList con punteros a los mismos elementos en el original.
fuente
Esto también debería funcionar:
fuente
Tenga en cuenta que esto es solo una copia superficial, no profunda, es decir. obtienes una nueva lista, pero las entradas son las mismas. Esto no es problema para simples cadenas. Obtener es más complicado cuando las entradas de la lista son objetos en sí mismos.
fuente
fuente
No soy un profesional de Java, pero tengo el mismo problema y traté de resolverlo con este método. (Supongamos que T tiene un constructor de copia).
fuente
List
clase de implementación tenga un constructor público sin argumentos. Por ejemplo, elList
s regresa porArray.asList
,List.of
oList.subList
probablemente no.