Como faço para clonar uma lista genérica em Java?

Eu tenho um ArrayList que gostaria de retornar uma cópia. ArrayList tem um método clone com a seguinte assinatura:

 public Object clone() 

Depois que eu chamo este método, como faço para converter o object retornado de volta para ArrayList ?

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

Por que você iria querer clonar? Criar uma nova lista geralmente faz mais sentido.

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

Tarefa concluída.

Este é o código que eu uso para isso:

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

Esperança é útil para você

Esteja ciente de que Object.clone () tem alguns problemas importantes e seu uso é desencorajado na maioria dos casos. Por favor, veja o item 11, de ” Effective Java “, de Joshua Bloch, para uma resposta completa. Eu acredito que você pode usar com segurança Object.clone () em matrizes de tipo primitivo, mas além disso você precisa ser criterioso sobre o uso adequado e substituição de clone. Provavelmente, é melhor definir um construtor de cópia ou um método de fábrica estático que clone explicitamente o object de acordo com sua semântica.

Eu acho que isso deve fazer o truque usando a API de collections:

Nota : o método de cópia é executado em tempo linear.

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

Com o Java 8, ele pode ser clonado com um stream.

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

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

Se você quer isto para poder devolver a Lista em um getter, seria melhor fazer:

 ImmutableList.copyOf(list); 

Eu acho que usando addAll funciona bem.

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

parênteses são usados ​​em vez da syntax genérica

Para clonar uma interface genérica como java.util.List você só precisará lançá-la. aqui você é um exemplo:

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

É um pouco complicado, mas funciona, se você está limitado a retornar uma interface de List , para que qualquer pessoa depois que você possa implementar sua lista sempre que ele quiser.

Eu sei que esta resposta está perto da resposta final, mas minha resposta responde como fazer tudo isso enquanto você está trabalhando com List – o genérico – não ArrayList

Tenha muito cuidado ao clonar ArrayLists. Clonar em java é superficial. Isso significa que ele só irá clonar o próprio Arraylist e não seus membros. Então, se você tem um ArrayList X1 e clona no X2, qualquer alteração no X2 também se manifestará em X1 e vice-versa. Quando você clona, ​​você só gera uma nova ArrayList com pointers para os mesmos elementos no original.

Isso também deve funcionar:

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

Eu não sou um profissional de java, mas tenho o mesmo problema e tentei resolver por este método. (Suponha que T tenha um construtor de cópia).

  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); } }