Come faccio a clonare una lista generica in Java?

Ho un ArrayList che mi piacerebbe restituire una copia di. ArrayList ha un metodo clone ha la seguente firma:

 public Object clone() 

Dopo aver chiamato questo metodo, come posso eseguire il cast dell’object restituito su ArrayList ?

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

Perché vorresti clonare? Creare una nuova lista di solito ha più senso.

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

Lavoro fatto.

Questo è il codice che uso per questo:

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

La speranza è utile per te

Si noti che Object.clone () presenta alcuni problemi importanti e il suo utilizzo è scoraggiato nella maggior parte dei casi. Si prega di consultare l’articolo 11, da ” Effective Java ” di Joshua Bloch per una risposta completa. Credo che si possa usare in modo sicuro Object.clone () su array di tipi primitivi, ma a parte questo è necessario essere giudiziosi sull’uso corretto e sull’override del clone. Probabilmente stai meglio definendo un costruttore di copie o un metodo factory statico che clona esplicitamente l’object secondo la tua semantica.

Penso che questo dovrebbe fare il trucco usando l’API Collections:

Nota : il metodo di copia viene eseguito in tempo lineare.

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

Con Java 8 può essere clonato con un stream.

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

 List clone = myList.stream().collect(toList()); 

Trovo che l’utilizzo di addAll funzioni bene.

 ArrayList copy = new ArrayList(); copy.addAll(original); 

vengono utilizzate le parentesi piuttosto che la syntax generica

Se vuoi questo per poter restituire la Lista in un getter, sarebbe meglio fare:

 ImmutableList.copyOf(list); 

Per clonare un’interfaccia generica come java.util.List devi solo lanciarla. eccovi un esempio:

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

È un po ‘complicato, ma funziona, se sei limitato a restituire un’interfaccia di List , in modo che chiunque dopo di te possa implementare la tua lista quando vuole.

So che questa risposta è vicina alla risposta finale, ma la mia risposta risponde come fare tutto ciò mentre si lavora con List – il genitore generico – non ArrayList

Fai molta attenzione durante la clonazione di ArrayList. La clonazione in Java è superficiale. Ciò significa che clonerà solo l’Arraylist stesso e non i suoi membri. Quindi se hai un ArrayList X1 e lo fai clonare in X2 qualsiasi cambiamento in X2 si manifesterà anche in X1 e viceversa. Quando cloni creerai solo una nuova ArrayList con puntatori agli stessi elementi nell’originale.

Questo dovrebbe funzionare anche:

 ArrayList orig = new ArrayList(); ArrayList copy = (ArrayList) orig.clone() 
 ArrayList first = new ArrayList (); ArrayList copy = (ArrayList) first.clone (); 

Non sono un professionista di Java, ma ho lo stesso problema e ho cercato di risolvere con questo metodo. (Supponiamo che T abbia un costruttore di copie).

  public static  List clone(List list) { try { List 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); } }