Chamar clone () em uma matriz também clona seu conteúdo?
92
Se eu invocar o clone()método na matriz de objetos do tipo A, como ele clonará seus elementos? A cópia fará referência aos mesmos objetos? Ou vai chamar (element of type A).clone()cada um deles?
clone()cria uma cópia superficial. O que significa que os elementos não serão clonados. (E se eles não implementaram Cloneable?)
Você pode querer usar Arrays.copyOf(..)para copiar matrizes em vez de clone()(embora a clonagem seja boa para matrizes, ao contrário de qualquer outra coisa)
Um pequeno exemplo para ilustrar a superficialidade de clone()até mesmo se os elementos forem Cloneable:
ArrayList[] array =newArrayList[]{newArrayList(),newArrayList()};ArrayList[] clone = array.clone();for(int i =0; i < clone.length; i ++){System.out.println(System.identityHashCode(array[i]));System.out.println(System.identityHashCode(clone[i]));System.out.println(System.identityHashCode(array[i].clone()));System.out.println("-----");}
E, se você fosse fazer isso, pessoalmente eu usariaSystem.arrayCopy
corsiKa
1
clone()é uma boa opção para usar com arrays ... quase exclusivamente. Bloch menciona que ele o usaria apenas para matrizes e nada mais. System.arrayCopyestá bem. Arrays.copyOf(..)é outra alternativa mais fácil de usar.
Bozho
Retiro - eu usaria Arrays.copyOf:-) Ele tem uma assinatura de método que simplifica as variáveis (sim, limita você, mas é perfeito para a maioria dos casos) e no meu JDK, pelo menos, é implementado usando System.arrayCopyassim mesmo. Obrigado por essa dica!
corsiKa
@Bozho, do seu exemplo, array [i] e clone [i] se referem ao mesmo objeto, então os dois primeiros sysouts são os mesmos. Mas array [i] .clone também se referiria ao próprio array [i], então por que array [i] .clone () retorna um valor hashcode diferente?
abhihello123
@weakstudent, array[i].clone()NÃO se refere a array[i]. Isso é o que essa parte do exemplo está demonstrando.
Dathan
19
Se eu invocar o método clone () na matriz de Objetos do tipo A, como ele clonará seus elementos?
Os elementos da matriz não serão clonados.
A cópia fará referência aos mesmos objetos?
Sim.
Ou irá chamar (elemento do tipo A) .clone () para cada um deles?
Você está me dizendo que eu posso clone1D array de primitivas e obter uma cópia profunda? Isso é tão incrível! Saem bem Arrays.copyOfRange(), System.arraycopy()!
Janez Kuhar
1
Yessssss! Matriz 1D de primitivas são copiadas quando a matriz é clonada
Thamme Gowda
1
Observe que Thamme Gowda N diz "primitivos". Clones de arrays de objetos serão apenas um clone de referências.
Kristiaan
como os primitivos não têm estado, eles são inerentemente imutáveis. Você não pode fazer uma cópia superficial dos primitivos, pois não há referência
Xerus
5
O clone é uma cópia superficial da matriz.
Este código de teste imprime:
[1, 2] / [1, 2]
[100, 200] / [100, 2]
porque o MutableIntegeré compartilhado em ambos os arrays como objects[0]e objects2[0], mas você pode alterar a referência objects[1]independentemente de objects2[1].
Respostas:
clone()
cria uma cópia superficial. O que significa que os elementos não serão clonados. (E se eles não implementaramCloneable
?)Você pode querer usar
Arrays.copyOf(..)
para copiar matrizes em vez declone()
(embora a clonagem seja boa para matrizes, ao contrário de qualquer outra coisa)Se você quiser clonagem profunda, verifique esta resposta
Um pequeno exemplo para ilustrar a superficialidade de
clone()
até mesmo se os elementos foremCloneable
:Impressões:
fonte
System.arrayCopy
clone()
é uma boa opção para usar com arrays ... quase exclusivamente. Bloch menciona que ele o usaria apenas para matrizes e nada mais.System.arrayCopy
está bem.Arrays.copyOf(..)
é outra alternativa mais fácil de usar.Arrays.copyOf
:-) Ele tem uma assinatura de método que simplifica as variáveis (sim, limita você, mas é perfeito para a maioria dos casos) e no meu JDK, pelo menos, é implementado usandoSystem.arrayCopy
assim mesmo. Obrigado por essa dica!array[i].clone()
NÃO se refere aarray[i]
. Isso é o que essa parte do exemplo está demonstrando.Os elementos da matriz não serão clonados.
Sim.
Não, não chamará
clone()
nenhum dos elementos.fonte
A matriz 1D de primitivas copia elementos quando é clonada. Isso nos tenta a clonar array 2D (Array of Arrays).
Lembre-se de que o clone de array 2D não funciona devido à implementação de cópia superficial de
clone()
.fonte
clone
1D array de primitivas e obter uma cópia profunda? Isso é tão incrível! Saem bemArrays.copyOfRange()
,System.arraycopy()
!O clone é uma cópia superficial da matriz.
Este código de teste imprime:
porque o
MutableInteger
é compartilhado em ambos os arrays comoobjects[0]
eobjects2[0]
, mas você pode alterar a referênciaobjects[1]
independentemente deobjects2[1]
.fonte