Eu tenho um ArrayList<String>
que 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 converter o objeto retornado de volta ArrayList<String>
?
Respostas:
fonte
ArrayList<String> newArrayList = (ArrayList<String>) oldArrayList.clone();
.List<String>
vez deArrayList<String>
no lado esquerdo. É assim que as coleções devem ser usadas na maioria das vezes.Por que você gostaria de clonar? Criar uma nova lista geralmente faz mais sentido.
Tarefa concluída.
fonte
ArrayList(Collection<? extends E> c)
significa que não importa que tipo de lista você usa como argumento.Este é o código que eu uso para isso:
A esperança é útil para você
fonte
ArrayList
usoArrayList<YourObject>
ArrayList
construtor?Com o Java 8, ele pode ser clonado com um fluxo.
...
fonte
toCollection
pode ser uma escolha melhor.Esteja ciente de que Object.clone () tem alguns problemas importantes e seu uso é desencorajado na maioria dos casos. Consulte o Item 11, do " Java Efetivo ", de Joshua Bloch, para obter uma resposta completa. Eu acredito que você pode usar com segurança o Object.clone () em matrizes de tipo primitivo, mas, além disso, você precisa ser criterioso quanto ao uso e substituição do clone. Provavelmente, é melhor definir um construtor de cópias ou um método estático de fábrica que clone explicitamente o objeto de acordo com sua semântica.
fonte
Eu acho que isso deve fazer o truque usando a API de coleções:
Nota : o método de cópia é executado em tempo linear.
fonte
List<MySerializableObject> copyList = new ArrayList<>(mMySerializableObjects.size());
Parece que usarcopyList.addAll(original);
é uma boa alternativaint
argumentos misteriosos . Não sei por que você deseja usar esse método estático obscuro em vez de bom e velhoaddAll
.Acho que o uso de addAll funciona bem.
parênteses são usados em vez da sintaxe genérica
fonte
new ArrayList<String>(original)
?Se você quiser isso para poder retornar a Lista em um getter, seria melhor fazer:
fonte
Para clonar uma interface genérica como
java.util.List
você só precisará convertê-la. aqui está um exemplo:É um pouco complicado, mas funciona, se você estiver limitado a retornar uma
List
interface, para que qualquer pessoa após você possa implementar sua lista sempre que ele quiser.Sei que esta resposta está próxima da resposta final, mas minha resposta responde como fazer tudo isso enquanto você trabalha com
List
- o genérico - nãoArrayList
fonte
Tenha muito cuidado ao clonar ArrayLists. A clonagem em java é superficial. Isso significa que ele apenas clonará a própria lista de arrays 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. Quando você clona, você gera apenas uma nova ArrayList com ponteiros para os mesmos elementos no original.
fonte
Isso também deve funcionar:
fonte
Lembre-se de que esta é apenas uma cópia superficial e não profunda, ou seja. você recebe uma nova lista, mas as entradas são as mesmas. Isso não é problema para simplesmente seqüências de caracteres. Fica mais complicado quando as entradas da lista são objetos.
fonte
fonte
Eu não sou um profissional de java, mas tenho o mesmo problema e tentei resolver por esse método. (Supõe que T tenha um construtor de cópias).
fonte
List
classe de implementação tenha um construtor público no-arg. Por exemplo, oList
s retorna porArray.asList
,List.of
ouList.subList
provavelmente não.