89

String1つのフィールドでクラスを作成しました。==次に、2つのオブジェクトを作成し、演算子も使用してそれらを比較する必要があり.equals()ます。これが私がしたことです:

public class MyClass {

    String a;

    public MyClass(String ab) {
        a = ab;
    }

    public boolean equals(Object object2) {
        if(a == object2) { 
            return true;
        }
        else return false;
    }

    public boolean equals2(Object object2) {
        if(a.equals(object2)) {
            return true;
        }
        else return false;
    }



    public static void main(String[] args) {

        MyClass object1 = new MyClass("test");
        MyClass object2 = new MyClass("test");

        object1.equals(object2);
        System.out.println(object1.equals(object2));

        object1.equals2(object2);
        System.out.println(object1.equals2(object2));
    }


}

コンパイル後、結果として2回falseが表示されます。2つのオブジェクトが同じフィールド(「テスト」)を持っている場合、なぜそれが間違っているのですか?

4

15 に答える 15

154

==オブジェクト参照を比較し、2つのオペランドが同じオブジェクト(同等のオブジェクトではなく、同じオブジェクト)を指しているかどうかを確認します。

文字列を比較する場合(同じ文字が含まれているかどうかを確認するため)、。を使用して文字列を比較する必要がありますequals

あなたの場合、MyClass文字列が一致する場合、の2つのインスタンスが実際に等しいと見なされると、次のようになります。

public boolean equals(Object object2) {
    return object2 instanceof MyClass && a.equals(((MyClass)object2).a);
}

a...しかし、通常、クラスを定義している場合、単一のフィールド(この場合)の同等性よりも同等性の方が重要です。


補足:をオーバーライドする場合equals、ほとんどの場合、をオーバーライドする必要がありますhashCodeequalsJavaDocで言うように:

hashCodeメソッドの一般的なコントラクトを維持するために、このメソッドがオーバーライドされるたびにメソッドをオーバーライドする必要があることに注意してくださいhashCode。これは、等しいオブジェクトには等しいハッシュコードが必要であると述べています。

于 2012-11-14T21:38:53.127 に答える
20

等しいをオーバーライドする必要があります

 public boolean equals (Object obj) {
     if (this==obj) return true;
     if (this == null) return false;
     if (this.getClass() != obj.getClass()) return false;
     // Class name is Employ & have lastname
     Employe emp = (Employee) obj ;
     return this.lastname.equals(emp.getlastname());
 }
于 2015-07-15T11:38:20.277 に答える
7

2つのオブジェクトを比較する最良の方法は、それらをjson文字列に変換して文字列を比較することです。これは、複雑なネストされたオブジェクト、フィールド、および/または配列を含むオブジェクトを処理する場合の最も簡単なソリューションです。

サンプル:

import com.google.gson.Gson;


Object a = // ...;
Object b = //...;
String objectString1 = new Gson().toJson(a);
String objectString2 = new Gson().toJson(b); 

if(objectString1.equals(objectString2)){
    //do this
}
于 2016-02-22T20:25:03.973 に答える
6

上書き関数equals()が間違っています。オブジェクト「a」はStringクラスのインスタンスであり、「object2」はMyClassクラスのインスタンスです。それらは異なるクラスであるため、答えは「false」です。

于 2015-07-01T13:00:32.443 に答える
5

equals2を呼び出しているように見えるequalsので、同じ結果が得られます。

于 2012-11-14T21:38:38.447 に答える
3

あなたのequals2()メソッドは常に同じものを返しますequals()!!

私のコメント付きのあなたのコード:

public boolean equals2(Object object2) {  // equals2 method
    if(a.equals(object2)) { // if equals() method returns true
        return true; // return true
    }
    else return false; // if equals() method returns false, also return false
}
于 2012-11-14T21:38:02.177 に答える
2

はしばらくの間はのインスタンスであるため、ステートメントa == object2a.equals(object2)両方が常に返されますfalseastringobject2MyClass

于 2014-08-01T09:01:27.963 に答える
2

実装は次のようにする必要があります。

public boolean equals2(Object object2) {
    if(a.equals(object2.a)) {
        return true;
    }
    else return false;
}

この実装では、両方の方法が機能します。

于 2014-10-31T15:52:12.153 に答える
2

クラスは、同じ機能を実現するためにComparableインターフェースを実装する場合があります。クラスは、インターフェースで宣言されたcompareTo()メソッドを実装する必要があります。

public class MyClass implements Comparable<MyClass>{

    String a;

    public MyClass(String ab){
        a = ab;
    }

    // returns an int not a boolean
    public int compareTo(MyClass someMyClass){ 

        /* The String class implements a compareTo method, returning a 0 
           if the two strings are identical, instead of a boolean.
           Since 'a' is a string, it has the compareTo method which we call
           in MyClass's compareTo method.
        */

        return this.a.compareTo(someMyClass.a);

    }

    public static void main(String[] args){

        MyClass object1 = new MyClass("test");
        MyClass object2 = new MyClass("test");

        if(object1.compareTo(object2) == 0){
            System.out.println("true");
        }
        else{
            System.out.println("false");
        }
    }
}
于 2016-10-09T19:09:13.180 に答える
2

"=="演算子は、2つの参照がメモリ内の同じオブジェクトを指している場合にのみtrueを返します。一方、equals()メソッドは、オブジェクトの内容に基づいてtrueを返します。

例:

String personalLoan = new String("cheap personal loans");
String homeLoan = new String("cheap personal loans");

//since two strings are different object result should be false
boolean result = personalLoan == homeLoan;
System.out.println("Comparing two strings with == operator: " + result);

//since strings contains same content , equals() should return true
result = personalLoan.equals(homeLoan);
System.out.println("Comparing two Strings with same content using equals method: " + result);

homeLoan = personalLoan;
//since both homeLoan and personalLoan reference variable are pointing to same object
//"==" should return true
result = (personalLoan == homeLoan);
System.out.println("Comparing two reference pointing to same String with == operator: " + result);

出力:2つの文字列を==演算子で比較:false equalsメソッドを使用して同じ内容の2つの文字列を比較:true同じ文字列を指す2つの参照を==演算子で比較:true

リンクから詳細を取得することもできます:http://javarevisited.blogspot.in/2012/12/difference-between-equals-method-and-equality-operator-java.html ?m = 1

于 2016-10-19T18:23:25.057 に答える
2

デフォルトのtoString()関数をカスタマイズする必要がない場合、別の方法は、比較するすべての属性を返すtoString()メソッドをオーバーライドすることです。次に、2つのオブジェクトのtoString()出力を比較します。文字列にクラス名を含むIntelliJIDEAIDEを使用してtoString()メソッドを生成しました。

public class Greeting {
private String greeting;

@Override
public boolean equals(Object obj) {
    if (this == obj) return true;
    return this.toString().equals(obj.toString());
}

@Override
public String toString() {
    return "Greeting{" +
            "greeting='" + greeting + '\'' +
            '}';
}
}
于 2018-05-01T07:16:44.133 に答える
1

object.equalsの戻り型はすでにブール値です。ブランチを持つメソッドでラップする必要はありません。したがって、2つのオブジェクトを比較する場合は、単にそれらを比較します。

boolean b = objectA.equals(objectB);

bはすでにtrueまたはfalseのいずれかです。

于 2014-08-06T20:36:20.157 に答える
1

==を使用すると、実際のオブジェクトではなく、オブジェクトの参照が比較されます。Javaオブジェクトを比較するには、equalsメソッドをオーバーライドする必要があります。

C ++には演算子のオーバーロードがあり、Javaには演算子のオーバーロードはありません。また、Javaの他の可能性は、compareToメソッドを定義するCompareInterface実装することです。

コンパレータインターフェースも使用され、2つのオブジェクトを比較します

于 2014-09-08T03:59:30.733 に答える
1

ここで、出力はfalseになります。これは、Myclassタイプの文字列型変数を他のMyClass型と比較しようとしている最初のsoplnステートメントで、両方がObject型であり、 "=="opreratorwhichを使用しているために許可されます。メモリ内の実際の文字列ではなく、実際のメモリを保持している参照変数値をチェックします。2番目のsoplnでも、a.equals(object2)を再度呼び出しているのと同じです。ここで、aはobject1内の変数です。これに関するあなたの発見を私に知らせてください。

于 2017-07-06T14:26:40.977 に答える
-3

以下のコードでは、オーバーライドされたメソッド.equals()を呼び出しています。

public boolean equals2(Object object2){if(a.equals(object2)){//ここでは、オーバーライドされたメソッドを呼び出しているため、falseが2回発生します。trueを返します。それ以外の場合はfalseを返します。}

于 2014-05-14T15:17:11.757 に答える