2009-10-15 6 views
3

Peut-être que je ne comprends pas comment fonctionne clone(). La valeur de retour ne devrait-elle pas être égale à l'appelant?Java: contrôles clone() et d'égalité

int[] nums = new int[] {0, 1, 2}; 
int[] list = nums.clone(); 
nums.equals(list); //returns false. Why? 

for (int ket = 0; ket < list.length; ket++) { 

     System.out.println(list[ket] == nums[ket]); //prints out true every time 
} 

list == nums //false 

Répondre

11

Parce que la mise en œuvre d'un tableau égal à égal est le même que l'objet qui est

public boolean equals(Object o) { 
    return this == o; 
} 

Voir aussi ce ce question

et dans les deux cas que vous avez testés, c'est faux. Les valeurs de référence de l'original et de la copie sont deux objets différents (avec la même valeur mais des références d'objet différentes).

La méthode clone crée une copie de l'objet donné. Lorsque le nouvel objet est créé, sa référence est différente de l'original. C'est pourquoi equals et == donnent des faux.

Si vous voulez tester l'égalité de deux tableaux, faire comme mmyers ici: Arrays.equals():

+0

C'est la meilleure réponse jusqu'à présent (l'attribuer). Lorsque vous envisagez d'implémenter Cloneable, ou de remplacer des égaux ou des hash-codes, veuillez lire: http://www.javaworld.com/javaworld/jw-01-1999/jw-01-object.html Mon conseil général: don ' t utilisez Cloneable/clone() mais utilisez un constructeur de copie (qui prend seulement une instance de la classe actuelle en argument) pour faire une copie.Sauvez-vous la douleur. –

7

Oscar Reyes a la bonne réponse. Je vais juste ajouter que Arrays.equals() fait exactement le genre de comparaison d'égalité que vous recherchez.

int[] nums = new int[] {0, 1, 2}; 
int[] list = nums.clone(); 
System.out.println(Arrays.equals(nums, list)); // prints "true" 
+0

+1 pour avoir terminé la réponse. Je vous lie sur le mien :) – OscarRyz

1

Jetez un oeil à la javadoc pour Objet.clone(), il est dit clairement que si elle est généralement le cas que: «x.clone() equals (x) » sera vrai, ce n'est pas un exigence absolue.

0

nums.equals (liste); // faux

liste == nums; // false

Raison: Par défaut, equals() se comportera comme l'opérateur "==" et comparera les emplacements des objets. ici nums et liste ont différents emplacements de mémoire. Mais, méthode égale est en fait destinée à comparer le contenu de 2 objets, et non leur emplacement en mémoire. Donc, pour l'accomplir, vous pouvez remplacer la méthode equals(). */

liste

[Ket] == ​​nums [Ket] // Vrai

Le clone est une copie superficielle du tableau. Donc, les deux font référence aux mêmes emplacements de mémoire. par conséquent, il retourne vrai