Eu tenho um ArrayList
l1
tamanho 10. Atribuo l1
ao novo tipo de referência de lista l2
. Will l1
e l2
apontar para o mesmo ArrayList
objeto? Ou é uma cópia do ArrayList
objeto atribuída l2
?
Ao usar a l2
referência, se eu atualizar o objeto de lista, ele também refletirá as alterações no l1
tipo de referência.
Por exemplo:
List<Integer> l1 = new ArrayList<Integer>();
for (int i = 1; i <= 10; i++) {
l1.add(i);
}
List l2 = l1;
l2.clear();
Não há outra maneira de atribuir uma cópia de um objeto de lista a uma nova variável de referência, além de criar 2 objetos de lista e fazer cópias em coleções de antigas para novas?
List.subList
para obter uma "visualização" em uma seção da lista original.(ArrayList<ArrayList<Object>>)
? isso criaria recursivamente cópias de todos os objetos filhos ArrayList?Tente usar
Collections.copy(destination, source);
fonte
new ArrayList<>(source);
?Collections.copy
não é de todo uma alternativa paranew ArrayList<>(source)
. O queCollections.copy
realmente faz é supor quedestination.size()
seja pelo menos tão grande quantosource.size()
e, em seguida, copie o intervalo índice por índice usando oset(int,E)
método O método não adiciona novos elementos ao destino. Consulte o código-fonte se não estiver claro o suficiente no Javadoc.Sim
l1
el2
apontará para a mesma referência, o mesmo objeto.Se você deseja criar um novo ArrayList com base no outro ArrayList, faça isso:
O resultado será
l1
ainda terá 2 elementos el2
terá 3 elementos.fonte
List<String> l2 = new ArrayList<String>(l1)
eList<String> l2 = l1
?Outra maneira conveniente de copiar os valores de src ArrayList para dest Arraylist é a seguinte:
Isso é cópia de valores real e não apenas cópia de referência.
fonte
Existe um método addAll () que servirá ao propósito de copiar um ArrayList para outro.
Por exemplo, você tem duas listas de matrizes : sourceList e targetList , use o código abaixo.
targetList.addAll (sourceList);
fonte
Java não passa objetos, ele passa referências (ponteiros) para objetos. Então sim, l2 e l1 são dois ponteiros para o mesmo objeto.
Você precisa fazer uma cópia explícita se precisar de duas listas diferentes com o mesmo conteúdo.
fonte
List.copyOf
List lista não modificávelVocê perguntou:
O Java 9 trouxe os
List.of
métodos para o uso de literais para criar umaList
classe concreta não modificável e desconhecida.Junto com isso, também conseguimos
List.copyOf
. Esse método também retorna umaList
classe concreta não modificável e desconhecida.Por "não modificável", queremos dizer que o número de elementos na lista e o referente referente ao objeto mantido em cada slot como um elemento são fixos. Você não pode adicionar, soltar ou substituir elementos. Mas o objeto referente mantido em cada elemento pode ou não ser mutável .
Veja este código executado ao vivo em IdeOne.com .
Você perguntou sobre referências a objetos. Como outros disseram, se você criar uma lista e atribuí-la a duas variáveis de referência (ponteiros), ainda terá apenas uma lista. Ambos apontam para a mesma lista. Se você usar um ponteiro para modificar a lista, os dois ponteiros verão as alterações posteriormente, pois há apenas uma lista na memória.
Então você precisa fazer uma cópia da lista. Se você deseja que a cópia não seja modificável, use o
List.copyOf
método conforme discutido nesta resposta. Nesta abordagem, você acaba com duas listas separadas, cada uma com elementos que mantêm uma referência aos mesmos objetos de conteúdo. Por exemplo, em nosso exemplo acima, usandoString
objetos para representar cores, os objetos de cores estão flutuando na memória em algum lugar. As duas listas contêm ponteiros para os mesmos objetos de cor. Aqui está um diagrama.A primeira lista
colors
é modificável. Isso significa que alguns elementos podem ser removidos como visto no código acima, onde removemos o terceiro elemento originalChartreuse
(índice de 2 = ordinal 3). E elementos podem ser adicionados. E os elementos podem ser alterados para apontar para outrosString
, comoOliveDrab
ouCornflowerBlue
.Por outro lado, os quatro elementos de
masterColors
são fixos. Sem remoção, sem adição e sem substituição de outra cor. EssaList
implementação não é modificável.fonte