次の例を通じてイコールの使い方をマスターしましょう
package cn.galc.test;public class TestEquals { public static void main(String[] args) { /** * ここでは、構築メソッド Cat() を使用して、ヒープ メモリに 2 つの新しい猫を作成しています。 * 2 つの猫。色、重さ、高さはすべて同じです * しかし、c1 と c2 は決して等しくありません。これは、c1 と c2 がヒープ メモリ内の 2 つの猫の参照オブジェクトであるためです。これには 2 匹の猫が見つかるアドレスが含まれていますが、2 匹の猫はヒープ メモリ内の 2 つの異なる領域に格納されているため、* c1 と c2 には異なるアドレスが含まれているため、c1 と c2 は決して等しくなりません。 */ Cat c1 = new Cat(1, 1, 1); Cat c2 = new Cat(1, 1, 1); System.out.println("c1==c2 の結果は次のとおりです: "+(c1== c2 ));//false System.out.println("c1.equals(c2) の結果は次のとおりです: "+c1.equals(c2));//false }}class Cat { int color,体重、高さ; public Cat(int 色、int 重み、int 高さ) { this.weight = 体重; }}c1とc2の比較結果を解析するメモリ解析図を描く
プログラム:
猫 c1 = 新しい猫 (1,1,1);猫 c2 = 新しい猫 (1,1,1);
実行後のメモリ内のレイアウトは次のようになります。
c1 はオブジェクトを指し、c2 もオブジェクトを指します。C1 と c2 には、これら 2 つの Cat オブジェクトのヒープ メモリに格納されているアドレスが含まれます。2 つの Cat オブジェクトは異なる記憶領域にあるため、c1 と c2 には次のアドレスが含まれます。は明らかに等しくありません。したがって、2 つの参照オブジェクト c1 と c2 は明らかに等しくありません。したがって、「System.out.println(c1==c2);」を実行すると、出力される結果は確実に false になります。したがって、new を使用して 2 つのオブジェクトを作成します。2 つのオブジェクトの参照が同じになることはありません。同じであれば、一方が上書きされることはありません。 c1 が c2 に等しいかどうかは、2 つの参照 c1 と c2 に含まれる内容を比較します。これは、new によって生成される 2 つのオブジェクトの参照が同じになることはなく、したがって、2 つの参照 c1 と c2 の内容も同じになることはありません。 c1 が c2 と等しくなることはあり得ません。したがって、2 つのオブジェクトの参照を比較しても、2 つのオブジェクトが等しいか同一になることはありません。
2 つのオブジェクトが等しいかどうかを判断するには、2 つのオブジェクトの参照が等しいかどうかを比較することはできません。2 つのオブジェクトの参照が等しくなることはないため、正しい比較方法はこれらを直接比較することです。 2 つのオブジェクトを比較し、2 つのオブジェクトの本質が同じかどうか、つまり 2 つのオブジェクトの属性値が等しいかどうかを比較することで、2 つのオブジェクトが等しいかどうかを判断します。は同じです。
Object クラスには、2 つのオブジェクトの内容が同じかどうかを比較するための equals() メソッドが用意されているため、このメソッドを使用して 2 つのオブジェクトが論理的に「等しい」かどうかを比較できます。例: c1.equals(c2); ここでは、Object クラスから継承された equals() メソッドの呼び出しを示します。API ドキュメントを参照すると、Object クラスの equals メソッドの定義は次のようになります。
public booleanquals(Object obj)
Object クラスで提供される Equals() メソッドのデフォルトの実装では、現在のオブジェクトの参照と比較する参照を比較して、それらが同じオブジェクトを指しているかどうかを確認します。これは「c1==c2」と同じです。 ". 、"c1.equals(c2)" および "c1==c2" は完全に同等です。したがって、継承されたequals()メソッドを直接使用すると、2つのオブジェクトの内容が同じかどうかを直接比較できません。このため、equals()メソッドをオーバーライドし、このメソッドのデフォルトの実装を変更する必要があります。
次に、Cat クラスの継承されたquals() メソッドを書き換えます。
class Cat { int color, Weight, height; public Cat(int color, int Weight, int height) { this.color = color; this.weight = height } /** * これは等価性を書き換えています。 Object クラスから継承された equals() メソッドは、このメソッドのデフォルトの実装を変更します。 * 2 つのオブジェクトが論理的に等しいかどうかを判断するには、独自に定義した実装を使用します。 * ここでは、2 匹の猫の色、体重、身長が同じである場合、* 2 匹の猫は論理的に同一である、つまり 2 匹の猫は「等しい」と考えると定義します。 */ public booleanquals(Object obj){ if (obj==null){ return false; } else{ /** *instanceof はオブジェクト演算子です。 * オブジェクト演算子は、オブジェクトが指定されたクラスまたは指定されたサブクラスのインスタンスに属するかどうかを判断するために使用されます。 * オブジェクト演算子は、instanceof という単語を組み合わせたものです。 * この演算子は二項演算子です。左側の式はオブジェクトであり、右側の式はクラスです。 * 左側のオブジェクトが右側のクラスによって作成されたオブジェクトである場合、演算の結果は次のようになります。 true、それ以外の場合は false です。 */ if (obj instanceof Cat){ Cat c = (Cat)obj; if (c.color==this.color && c.weight==this.weight && c.height==this.height){ return true; false を返します。このとき、main メソッドで印刷コマンドを実行します。
public static void main(String[] args) { /** * ここでは、構築メソッド Cat() を使用してヒープ メモリに 2 つの新しい猫を作成しています。 * これら 2 つの猫の色、重さ、高さは同じです。 * しかし、c1 と c2 は決して等しくありません。これは、c1 と c2 がヒープ メモリ内の 2 つの猫の参照オブジェクトであるためです。 * 2 つの猫は、ヒープメモリ 2 つの異なる空間で、 *したがって、c1 と c2 は異なるアドレスを保持するため、c1 と c2 が等しくなることはありません。 */ Cat c1 = new Cat(1, 1, 1); Cat c2 = new Cat(1, 1, 1); System.out.println("c1==c2 の結果は次のとおりです: "+(c1== c2 ));//false System.out.println("c1.equals(c2) の結果は次のとおりです: "+c1.equals(c2));//true }今回取得した結果は、前回、equals() メソッドをオーバーライドせずに取得した結果とは異なります。
"System.out.println(c1 == c2);" 2 つのオブジェクトの参照の内容が比較されるため、出力される結果は false のままです。もちろん、2 つの参照の内容は等しくありません。は等しいため、出力される結果は false になる必要があります。
"System.out.println(c1.equals(c2));" Cat クラスの equals() メソッドを書き直し、このメソッドのデフォルトの実装を変更したため、出力された結果は true になります。メソッドのみを変更しますこれらの 2 つの物体が実際に存在し、両方とも猫であり、色、身長、体重が同じである場合、2 匹の猫は論理的に同一であり、まったく同じです。つまり、これら 2 匹の猫は「等しい」ことになります。したがって、ここに出力される結果は true です。
では、2 つの文字列オブジェクトが等しいかどうかを比較するにはどうすればよいでしょうか?
次の例を見てください。
public class TestEquals { public static void main(String args[]){ String s1 = new String("hello"); String s2 = new String("hello"); System.out.println("s1 == s2 result : "+(s1 == s2));//false System.out.println("s1.equals(s2) の結果は次のとおりです: "+s1.equals(s2));//true }}今回は、2 つの文字列オブジェクトが等しいかどうか比較されます。
System.out.println(s1 == s2);
2 つの文字列オブジェクト s1 と s2 の参照がここで比較されるため、出力される結果は false のままです。そのため、出力される結果は false になります。
System.out.println(s1.equals(s2));
Object クラスからの継承が String クラスで書き換えられるため、出力された結果は true になります (すべてのクラスは Object クラスから継承され、もちろん String クラスも例外ではありません。親クラスから継承すると、すべてが得られます)親クラスの属性とメソッドに対応しているため、Sting クラスにもquals() メソッドがあり、継承されたequals() メソッドも書き換えられており、このメソッドのデフォルトの実装が変更されています。
String クラスでは、equals() メソッドの実装は次のようにオーバーライドされます。現在の文字列オブジェクトと指定された文字列オブジェクトを比較します。指定された文字列オブジェクトは空であってはならず、このオブジェクトの文字シーケンスは現在の文字列と同じです。オブジェクトの文字列シーケンスが同じである場合、2 つの文字列オブジェクトは等しいことになります。
したがって、ここでは s2 が条件を満たしているため、出力結果は true になります。
将来、特定のクラス内の 2 つのオブジェクトが等しいかどうかを比較する場合は、まず API ドキュメントを参照して、このクラスが Object クラスから継承した equals() メソッドをオーバーライドしているかどうかを確認してください。 equals() メソッドがオーバーライドされている場合は、2 つのオブジェクトが等しいかどうかを比較するときに、オーバーライドされた equals() メソッドが呼び出されます。オーバーライドされていない場合は、Object クラスから継承されたものが直接呼び出されます。は、equals() メソッドのデフォルト実装を使用して、2 つのオブジェクトが等しいかどうかを比較します。したがって、各クラスは、必要に応じて、Object クラスから継承された equals() メソッドをオーバーライドできます。
API ドキュメント内で特定のクラスを見つけるには、パッケージを導入せずにクラスを直接使用できる場合、このクラスは java.lang パッケージ内にある必要があります。たとえば、ここでは String クラスが直接使用できるため、String クラスになります。これは java.lang パッケージ内にあります。特定のクラスを使用する場合は、そのクラスがインポートするパッケージを確認してから、そのパッケージに移動してクラスを見つけます。パッケージをインポートする必要のないクラスは、java.lang に直接移動してクラスを見つける必要があります。 。
通常、クラスを設計するときは、親クラスのequalsメソッドをオーバーライドする必要があります。このメソッドを書き換えるときは、次のルールに従って設計する必要があります。
1. 再帰性: 任意の参照値 X について、x.equals(x) の戻り値は true でなければなりません。
2. 対称性: 任意の参照値 x、y について、y.equals(x) の戻り値が true である場合に限り、x.equals(y) の戻り値は true でなければなりません。
3. 推移性: x.equals(y)=true、y.equals(z)=true の場合、x.equals(z)=true
4. 一貫性: 比較に参加するオブジェクトが変化しない場合、オブジェクト比較の結果も変化しないはずです。
5. null 非許容性: null 以外の参照値 X の場合、x.equals(null) の戻り値は false でなければなりません。
例えば:
public class People { private String firstName; private int age; public String getFirstName() { return firstName; } public String getLastName; public void setLastName(String lastName) { this.lastName = lastName } public int getAge() { return age; } public void setAge(int age) { this.age = age; } @Override public booleanquals(Object obj) { if (this == obj) が true を返す; if (obj == null) が false を返す if (getClass() != obj.getClass() return false; People other = (People) obj; if (age != other.age) return false; if (other.firstName != null) return false; (!firstName.equals(other.firstName)) return false; if (lastName == null) { if (other.lastName != null) return false } else if (!lastName.equals(other.lastName)) return false ; true を返します。
この例では、姓、名、年齢が同じであれば同一人物であると規定しています。もちろん、他の属性を追加することもできます。たとえば、ID 番号が同じである必要があると判断する場合は、equals メソッドに ID 番号の判定を追加することもできます。
要約: 2 つのオブジェクトが等しいかどうかを比較するには、equals() メソッドを使用します。2 つのオブジェクトが等しいかどうかを判断するための条件は、equals() メソッドの実装を書き直した後で定義されます。異なるクラス内の同じクラスの 2 つのオブジェクトを比較して、それらが等しいかどうかを確認します。