Método Clone para Matrizes Java

O que exatamente o método clone () em Java retorna quando usado em uma matriz? Retorna um novo array com dados copiados do original?

Ex:

int[] a = {1,2,3}; int[] b = a.clone(); 

Quando o método clone é invocado em uma matriz, ele retorna uma referência a uma nova matriz que contém (ou faz referência a) os mesmos elementos da matriz de origem.

Portanto, no seu exemplo, int[] a é uma instância de object separada criada no heap e int[] b é uma instância de object separada criada no heap. (Lembre-se de todos os arrays são objects).

  int[] a = {1,2,3}; int[] b = a.clone(); System.out.println(a == b ? "Same Instance":"Different Instance"); //Outputs different instance 

Se fosse modificar int[] b as alterações não seriam refletidas em int[] a já que as duas são instâncias de object separadas.

  b[0] = 5; System.out.println(a[0]); System.out.println(b[0]); //Outputs: 1 // 5 

Isso se torna um pouco mais complicado quando a matriz de origem contém objects. O método clone retornará uma referência a uma nova matriz, que faz referência aos mesmos objects que a matriz de origem.

Então, se temos a class Dog

  class Dog{ private String name; public Dog(String name) { super(); this.name = name; } public String getName() { return name; } public void setName(String name) { this.name = name; } } 

e eu crio e preenche uma matriz do tipo Dog

  Dog[] myDogs = new Dog[4]; myDogs[0] = new Dog("Wolf"); myDogs[1] = new Dog("Pepper"); myDogs[2] = new Dog("Bullet"); myDogs[3] = new Dog("Sadie"); 

então clone dog …

  Dog[] myDogsClone = myDogs.clone(); 

as matrizes referem-se aos mesmos elementos …

  System.out.println(myDogs[0] == myDogsClone[0] ? "Same":"Different"); System.out.println(myDogs[1] == myDogsClone[1] ? "Same":"Different"); System.out.println(myDogs[2] == myDogsClone[2] ? "Same":"Different"); System.out.println(myDogs[3] == myDogsClone[3] ? "Same":"Different"); //Outputs Same (4 Times) 

Isso significa que, se modificarmos um object acessado por meio do array clonado, as alterações serão refletidas quando acessarmos o mesmo object no array de origem, uma vez que elas apontam para a mesma referência.

  myDogsClone[0].setName("Ruff"); System.out.println(myDogs[0].getName()); //Outputs Ruff 

No entanto, as alterações no próprio array afetarão apenas esse array.

  myDogsClone[1] = new Dog("Spot"); System.out.println(myDogsClone[1].getName()); System.out.println(myDogs[1].getName()); //Outputs Spot // Pepper 

Se você geralmente entende como as referências de object funcionam, é fácil entender como as matrizes de objects são afetadas pela clonagem e pelas modificações. Para obter mais informações sobre referências e primitivos, sugiro ler este excelente artigo .

Gist of Source Code

clone() método clone() cria e retorna uma cópia desse object. O significado preciso de “copiar” pode depender da class do object. A intenção geral é que, para qualquer object x, a expressão:

  x.clone() != x 

Será verdade e que a expressão:

  x.clone().getClass() == x.getClass() 

Será verdade, mas estes não são requisitos absolutos.

Enquanto é tipicamente o caso que:

  x.clone().equals(x) 

será verdade, isso não é um requisito absoluto.

Por convenção, o object retornado deve ser obtido chamando super.clone . Se uma class e todas as suas superclasss (exceto Object) obedecerem a esta convenção, será o caso que x.clone().getClass() == x.getClass() .

    Intereting Posts