Pergunta

eu tenho um ArrayList<String> do qual gostaria de devolver uma cópia. ArrayList possui um método clone que possui a seguinte assinatura:

public Object clone()

Depois de chamar esse método, como faço para converter o objeto retornado de volta para ArrayList<String>?

Foi útil?

Solução

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

Outras dicas

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

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

Tarefa concluída.

Este é o código que uso para isso:

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

Espero que seja útil para você

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

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

...

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

Esteja ciente de que Object.clone() tem alguns problemas importantes e seu uso é desencorajado na maioria dos casos.Consulte o item 11, de "Java eficaz" por Joshua Bloch para uma resposta completa.Acredito que você pode usar Object.clone() com segurança em matrizes de tipo primitivo, mas, fora isso, você precisa ser criterioso ao usar e substituir corretamente o clone.Provavelmente é melhor definir um construtor de cópia ou um método de fábrica estático que clone explicitamente o objeto de acordo com sua semântica.

Acho que isso deve funcionar usando a API de coleções:

Observação:o método de cópia é executado em tempo linear.

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

Acho que usar addAll funciona bem.

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

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

Se você quiser isso para poder retornar a Lista em um getter seria melhor fazer:

ImmutableList.copyOf(list);

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

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

É um pouco complicado, mas funciona, se você estiver limitado a devolver um List interface, para que qualquer pessoa depois de você possa implementar sua lista sempre que quiser.

Eu sei que esta resposta está próxima da resposta final, mas minha resposta responde como fazer tudo isso enquanto você trabalha com List -o pai genérico- não ArrayList

Tenha muito cuidado ao clonar ArrayLists.A clonagem em java é superficial.Isso significa que ele clonará apenas o próprio Arraylist e não seus membros.Portanto, se você tiver um ArrayList X1 e cloná-lo no X2, qualquer alteração no X2 também se manifestará no X1 e vice-versa.Ao clonar você gerará apenas um novo ArrayList com ponteiros para os mesmos elementos do original.

Isso também deve funcionar:

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

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

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

Tenha em mente que esta é apenas uma cópia superficial e não profunda, ou seja.você obtém uma nova lista, mas as entradas são as mesmas.Isso não é problema apenas para strings.Fica mais complicado quando as entradas da lista são os próprios objetos.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top