Java では、2 つのオブジェクトを結合することがありますが、得られる結果は期待どおりではありません。何が起こっているのでしょうか?
1. 2 つの比較形式: 比較する場合、どの種類の比較であるかを理解する必要があります。
1. 値型の比較
つまり、内容が同じであれば等しいとみなします。例: int i=5; int j =5; このとき、i と j は等しいと言いますが、これは実際には i と j の内容が同じであることを意味します。
2. 参照型の比較
しかし、Javaでは値型に加えて別の参照型があり、異なるオブジェクトの参照値は実際には等しくありません、つまり、異なるアドレスにあります。メモリ内の単位。たとえば、学生クラスを定義し、それぞれ 2 つの学生オブジェクト インスタンスを持っています:
Student stu= new Student(); Student stu1= new Student();
このとき、2 つのオブジェクトを比較するために stu==stu1 シンボルを使用するか、stu.equals(stu1) メソッドを使用するかは、参照型の場合、デフォルトでは 2 つのオブジェクトによって参照されるアドレスが比較されるため、結果はすべて不等です。これは、各オブジェクトの参照が独自の一意のアドレスを持っているため、等しくないことを示しています。
2. 場合によっては、2 つのオブジェクトを比較するときに、その内容が同じであれば、上の 2 つの Student オブジェクトのように、2 つのオブジェクトが等しいとみなします。このとき、私たちは何をすべきでしょうか?実際、クラス内のequals()メソッドを書き換えて、オブジェクトのコンテンツにアクセスするだけです。上記のように、Student クラスのquals() メソッドをオーバーライドするだけで済みます。
それでは、例を見てみましょう!equals() メソッドをオーバーライドせずに比較してみましょう:
Student クラス: Student クラス
package com.bluesky; public class Student { String name; public Student(){ } public Student(String name){ this.name=name; }</strong> }</span>
Test クラス Test:
package com.bluesky; public class Test { public static void main(String[] args) { int i=5; int j=5; if(i==j) System.out.println("i和j相等!"); else System.out.println("不相等!"); Student s = new Student("BlueSky"); Student s1=new Student("BlueSky"); if(s==s1) System.out.println("s和是s1相等!"); else System.out.println("s和是s1不相等!"); if(s.equals(s1)) System.out.println("s和是s1相等!"); else System.out.println("s和是s1不相等!"); } }
実行結果:
再比較quals() メソッドを書いた後:
Student クラス:
package com.bluesky; public class Student { String name; public Student(){ } public Student(String name){ this.name=name; } public boolean equals(Object obj) { if (this == obj) //传入的对象就是它自己,如s.equals(s);肯定是相等的; return true; if (obj == null) //如果传入的对象是空,肯定不相等 return false; if (getClass() != obj.getClass()) //如果不是同一个类型的,如Studnet类和Animal类, //也不用比较了,肯定是不相等的 return false; Student other = (Student) obj; if (name == null) { if (other.name != null) return false; } else if (!name.equals(other.name)) //如果name属性相等,则相等 return false; return true; }
Test クラス Test:
package com.bluesky; public class Test { public static void main(String[] args) { int i=5; int j=5; if(i==j) System.out.println("i和j相等!"); else System.out.println("不相等!"); Student s = new Student("BlueSky"); Student s1=new Student("BlueSky"); if(s==s1) System.out.println("s和是s1相等!"); else System.out.println("s和是s1不相等!"); if(s.equals(s1)) System.out.println("s和是s1相等!"); else System.out.println("s和是s1不相等!"); } }
Running result:
equals() メソッドを書き直すと、s と s1 が等しいことがわかります。 == 参照型ではアドレスのみを比較できるため、依然として等しくありません。
上記は、Java における 2 つのオブジェクトの比較、equals() メソッドと == 記号の違いです。さらに関連する内容については、PHP 中国語 Web サイト (www.php.cn) に注目してください。