[java] .equals () 및 == 연산자로 두 개체 비교

String필드 가 하나 인 클래스를 구성했습니다 . 그런 다음 두 개의 개체를 만들고 ==연산자를 사용하여 비교해야합니다 .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));
    }


}

컴파일 후 결과로 두 번 거짓이 표시됩니다. 두 개체에 동일한 필드 ( “test”)가 있으면 왜 거짓입니까?



답변

==객체 참조를 비교하여 두 피연산자가 동일한 객체를 가리키는 지 확인합니다 ( 동등한 객체가 아닌 동일한 객체).

문자열을 비교하려면 (동일한 문자가 포함되어 있는지 확인하기 위해)를 사용하여 문자열을 비교해야합니다 equals.

귀하의 경우 MyClass문자열이 일치 하면의 두 인스턴스가 실제로 동일한 것으로 간주되면 다음과 같습니다.

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

…하지만 일반적으로 클래스를 정의하는 경우 단일 필드 ( a이 경우) 의 동등성보다 동등성에 더 많은 것이 있습니다.


참고 :을 재정의하는 경우 equals거의 항상을 재정의해야합니다 hashCode. equalsJavaDoc 에서 다음과 같이 말합니다 .

일반적 hashCode으로이 메서드가 재정의 될 때마다 메서드 를 재정의해야한다는 점에 유의하십시오. 메서드에 대한 일반 계약을 유지하려면 hashCode동일한 개체가 동일한 해시 코드를 가져야한다고 명시합니다.


답변

같음을 재정의해야합니다.

 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());
 }


답변

equals2호출하는 것처럼 보이 equals므로 동일한 결과를 제공합니다.


답변

덮어 쓰기 함수 equals ()가 잘못되었습니다. 개체 “a”는 String 클래스 의 인스턴스 이고 “object2″는 MyClass 클래스 의 인스턴스입니다 . 클래스가 다르기 때문에 대답은 “거짓”입니다.


답변

두 객체를 비교하는 가장 좋은 방법은 객체를 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
}


답변

귀하의 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
}


답변

a == object2a.equals(object2)모두는 항상 돌아갑니다false 있기 때문에 aA는 string동안은 object2의 인스턴스이다MyClass