3

たぶん、私はどのように動作するのか理解していません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
4

5 に答える 5

11

array の equals 実装は Object と同じであるため、

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

これも参照してください この質問

テストした両方のケースで、それは誤りです。オリジナルとコピーの参照値は、2 つの異なるオブジェクトです (値は同じですが、オブジェクト参照は異なります)。

clone メソッドが行うことは、指定されたオブジェクトのコピーを作成することです。新しいオブジェクトが作成されると、その参照は元のオブジェクトとは異なります。そのためequals==利回りは false です。

2 つの配列が等しいかどうかをテストする場合は、ここで mmyers を実行します: Arrays.equals() :

于 2009-10-15T20:51:15.300 に答える
7

オスカー・レイエスが正解です。Arrays.equals()まさにあなたが探している種類の等値比較を行うことを付け加えておきます。

int[] nums = new int[] {0, 1, 2};
int[] list = nums.clone();
System.out.println(Arrays.equals(nums, list)); // prints "true"
于 2009-10-15T20:53:57.807 に答える
1

Objet.clone()の javadoc を見てください。「x.clone().equals(x)」が true になるのが一般的ですが、これは絶対的な要件ではないことが明確に述べられています。

于 2009-10-15T20:55:00.883 に答える
0

num.equals は要素の等価性をチェックしませんが、2 つの変数が同じオブジェクトを指しているかどうかをチェックするためです。あなたの場合、要素は同じですが、数字とリストは2つの異なるオブジェクトを指しています。

java.util.Arrays.equals(...) 関数を使用して比較を行うことができます。

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

于 2009-10-15T20:54:30.163 に答える
0

nums.equals(リスト); //間違い

リスト == 数値; //間違い

理由: デフォルトでは、equals() は「==」演算子と同じように動作し、オブジェクトの位置を比較します。ここで nums と list は異なるメモリ位置を持っています。

/* ただし、equals メソッドは実際には 2 つのオブジェクトの内容を比較するためのものであり、メモリ内の位置を比較するためのものではありません。したがって、それを達成するために equals() メソッドをオーバーライドできます。*/

list[ket] == nums[ket] //True

クローンは配列の浅いコピーです。したがって、両方とも同じメモリ位置を参照します。したがって、trueを返します

于 2015-07-22T09:00:20.497 に答える