Java: clone() и проверка на равенство

Возможно, я не понимаю, как работает clone(). Разве возвращаемое значение не должно равняться вызывающему?

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

person Nick Heiner    schedule 15.10.2009    source источник


Ответы (5)


Поскольку реализация equals для массива такая же, как и для объекта, который

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

См. это также это 888840#888840">вопрос

и в обоих случаях, которые вы проверили, это неверно. Ссылочные значения оригинала и копии — это два разных объекта (с одинаковым значением, но разными ссылками на объекты).

Что делает метод clone, так это создает копию данного объекта. При создании нового объекта его ссылка отличается от исходной. Вот почему equals и == дают false.

Если вы хотите проверить равенство двух массивов, сделайте здесь, как mmyers: ():

person OscarRyz    schedule 15.10.2009
comment
Это лучший ответ на данный момент (наградите его). Если вы планируете внедрить Cloneable или переопределить equals или hashcode, прочитайте: javaworld.com/javaworld/jw-01-1999/jw-01-object.html Мой совет общего назначения: не используйте Cloneable/clone(), а используйте конструктор копирования (который принимает только экземпляр текущего класса в качестве аргумента), чтобы сделать копию. Спаси себя от боли. - person Adriaan Koster; 16.10.2009

У Оскара Рейеса есть правильный ответ. Я просто добавлю, что Arrays.equals() делает именно то сравнение на равенство, которое вам нужно.

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

Посмотрите javadoc для Objet.clone(), в нем четко указано, что хотя обычно бывает так, что "x.clone().equals(x)" будет истинным, это не является абсолютным требованием.

person Gaël Marziou    schedule 15.10.2009

потому что num.equals не проверяет равенство элементов, но проверяет, указывают ли две переменные на один и тот же объект. В вашем случае хотя элементы и одинаковы, но числа и списки указывают на два разных объекта.

вы можете использовать функцию java.util.Arrays.equals(...) для сравнения.

http://java.sun.com/j2se/1.5.0/docs/api/java/util/Arrays.html#equals%28int[],%20int[]%29

person Pratik Bhatt    schedule 15.10.2009

nums.equals (список); //ЛОЖЬ

список == числа; //ЛОЖЬ

Причина: по умолчанию equals() ведет себя так же, как оператор «==» и сравнивает местоположения объектов. здесь числа и список имеют разные ячейки памяти.

/* Но метод equals на самом деле предназначен для сравнения содержимого двух объектов, а не их расположения в памяти. Поэтому для этого вы можете переопределить метод equals(). */

list[ket] == ​​nums[ket] //Истина

Клон — это неглубокая копия массива. Таким образом, оба относятся к одним и тем же ячейкам памяти. следовательно, он возвращает true

person madhuri    schedule 22.07.2015