2011-12-05 6 views
5

私は現在Javaファイナルを勉強しており、私は単純なequalsメソッドで悩まされています。配列のequalメソッドはどのように機能しますか?

与えられた質問は

「次の印刷を何、以下の配列宣言を考える」されたと私はそれはしかし、コピーした後、真偽、真であると貼り付けるだろうと思いましたコードは答えが偽、偽、真であることを明らかにする。

私は==がオブジェクトの同じインスタンスである場合にのみ動作することを理解していますが、最初のonがfalseである理由はわかりません。私は配列apiのメソッドを見つけることを試みたが、同じ引数を持つものを見つけることができませんでした。

これが明らかであれば、私は許してください、私は勉強している過去のカップルの夜遅くまでされており、現時点ではカフェインでかなり疲れています。

int[] d = { 1, 2, 3 }; 
int[] b = { 1, 2, 3 }; 
int[] c = d; 
System.out.println(d.equals(b)); 
System.out.println(d == b); 
System.out.println(d == c); 

答えて

16

基本的には、配列型は、値の平等を提供するために、equalsをオーバーライドしていない...あなたは参照の等価であるオブジェクトのデフォルトの実装で、で終わります。

配列内の値が等しい(つまり、同じ順序の要素が等しい)場合は、Arraysクラスの静的メソッドを使用します。

+1

+1は、シーケンス/値の平等を達成するためのヒントを提供します(あなたがJon Skeetだからではありません)。 –

+1

そして考えを完了するために、 'Arrays.equals'と' Arrays'のいくつかのオーバーロードがあります。あなたにもっと自然な平等を与えることができる「deepEquals(Object、Object)」です。 – yshavit

+0

オブジェクトはequalsメソッドを持っています....私は思うことができないことを知っていました。私の理解を助けてくれてありがとう! – Erik

3

プレーンJava配列(つまり、ArrayListなどではない)は、equalsを実装するのではなく、Objectの実装を使用します。これは基本的に単なるアドレス比較です。

(しかしjava.util.Arrays汎用アレイの一部の静的equalsメソッドを実装することに注意してください。)

1

配列はオブジェクトであり、通常、Object.equalsを(上書きしない)ので、オブジェクトの標準的な実装.equals()が適用されます。 array.equals(something)は、array == somethingの場合にのみ真となります。

1

アレイは暗黙的にObjectクラスを拡張します。したがって、あなたのequalsメソッドはそこから継承されます。 equalsメソッドのデフォルト実装は、同一性をチェックするだけです。つまり、==と同じです。

1

演算子==は、参照の等価性のみを比較するため、2番目と3番目のprint文は期待通りの結果を返します。

.equalsメソッドは、参照equality以外の手段で比較されるかもしれませんが、実際にはそのメソッドを実装するためにはクラス定義が必要です。 .equalsが配列クラスに実装されていない場合、ランタイムはObject#equalsに戻ります。これは、==演算子で検出されるのと同じ参照等価です。

つまり、配列のバッキングクラスには.equalsメソッドが存在しないか、要素ごとの比較とは異なる方法で実装されているようです。

関連する問題