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


84

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")가 있으면 왜 거짓입니까?


7
Btw, equalsand equals2: if(a) { return true; } else { return false; }당신이 아마 작성해야 할 형식의 무언가가있을 때마다 return a.
yshavit 2012

@yshavit 부울에서 문자열로 변경하면?
Fastkowy

4
아니, 당신의 코드는 부울는 사실 여부를 묻는하고, 반환 true이하고있는 경우 false그렇지. 예를 들어 그래서, if(a.equals(object2)) { return true; } else return false단지 수 있었다 return a.equals(object2).
yshavit 2012

답변:


142

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

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

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

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

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


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

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


@TJ In == 객체 참조를 비교하여 정교하게 설명합니다. == 두 객체의 해시 코드를 비교한다는 의미입니까?
Narendra Jaggi

@NarendraJaggi-아니요, JVM이 두 피연산자가 모두 동일한 개체를 참조하는지 확인한다는 의미입니다. 이를 수행하는 방법 은 JVM에 달려 있지만 해시 코드를 사용하여 수행 할 것이라고 생각할 이유가 없습니다.
TJ Crowder

19

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

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

2
이것은 틀림없이 가장 좋은 대답이지만, 원시 유형이 아닌 경우 (this == null) 대신 this.equals (obj)를 사용하고 싶을 수 있습니다.
goonerify

10
if (this == null)어쨌든 이 사건은 불필요 하다고 주장하고 싶습니다 . 호출 nullObject.equals(whatever)하면 null 포인터 예외가 발생하므로 작성할 수 this있는 Java 메서드에서 null이 아니라고 가정 할 수 있습니다.
Maura

1
이 때 실패 thislastname널 (null)을 이전 조건을 만족하지 않습니다.
Ahmed Raaj

6

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


5

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


5

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

9
나는 이것을 과잉이라고 부르고 싶다.
Rolf ツ

@Rolf ツ 왜 이것이 과잉이라고 생각합니까? 이 문제에 대한 해결책을 찾았고 이것이 지금까지 찾은 가장 쉬운 해결책입니다. 더 나은 제안을 환영합니다.
m5seppal

3
Java를 사용하면 먼저 Gson개체를 만든 다음 toJson. Gson객체를 생성하고 실제 객체를 플랫 String( toJson) 으로 변환하는 데 필요한 로직을 호출하는 것은 불필요한 오버 헤드입니다. 먼저 객체를 Json 문자열로 변환하지 않고도 객체를 비교할 수 있습니다 (더 빠름).
Rolf ツ 2017

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
}

5
그냥return a.equals(object2);
모주 바

2

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


2

구현은 다음과 같아야합니다.

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

이 구현에서는 두 가지 방법이 모두 작동합니다.


2

기본 toString () 함수를 사용자 정의 할 필요가없는 경우 다른 방법은 비교할 모든 속성을 반환하는 toString () 메서드를 재정의하는 것입니다. 그런 다음 두 객체의 toString () 출력을 비교합니다. 문자열에 클래스 이름을 포함하는 IntelliJ IDEA IDE를 사용하여 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 + '\'' +
            '}';
}
}

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

출력 : == 연산자를 사용하여 두 문자열 비교 : false equals 메서드를 사용하여 동일한 내용을 가진 두 문자열 비교 : true == 연산자를 사용하여 동일한 문자열을 가리키는 두 참조 비교 : true

http://javarevisited.blogspot.in/2012/12/difference-between-equals-method-and-equality-operator-java.html?m=1 링크에서 자세한 정보를 얻을 수도 있습니다.


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

1

object.equals의 반환 유형은 이미 부울입니다. 분기가있는 메서드로 래핑 할 필요가 없습니다. 따라서 두 개체를 비교하려면 간단히 비교하십시오.

boolean b = objectA.equals(objectB);

b는 이미 참 또는 거짓입니다.


1

==를 사용하면 실제 객체가 아닌 객체의 참조가 비교됩니다. Java 객체를 비교하려면 equals 메소드를 재정의해야합니다.

일부 추가 정보 C ++에는 연산자 오버로드가 있으며 Java는 연산자 오버로드를 제공하지 않습니다. 또한 Java의 다른 가능성은 compareTo 메소드를 정의하는 Compare Interface 구현 입니다.

비교기 인터페이스 는 두 개체를 비교하는데도 사용됩니다.


4
귀하의 답변은 거의 2 년 전에 말하지 않은 내용을 추가하지 않습니다.
Hot Licks 2014 년

1

여기서 출력은 첫 번째 sopln 문에서 false, false입니다. Myclass 유형의 문자열 유형 변수를 다른 MyClass 유형과 비교하려고하는데 둘 다 Object 유형이고 "=="oprerator를 사용했기 때문에 허용됩니다. 메모리 내부의 실제 contnet이 아닌 실제 메모리를 보유하는 참조 변수 값을 확인합니다. 두 번째 sopln에서도 a.equals (object2)를 다시 호출하는 것과 동일합니다. 여기서 a는 object1 내부의 변수입니다. 이것에 대한 당신의 발견을 알려주십시오.


2
stackoverflow bidyadhar에 오신 것을 환영합니다. 이 질문의 날짜는 2012 년 11 월 14 일이며 이미 좋은 답변을 받았습니다 (OP 승인). 당신이 얻은 정보는 정확하지만 유용한 정보를 추가하지 않습니다. 나는 당신이 무엇이든을하기 전에 규칙을 읽어 제안
니카이

-3

아래 코드에서 재정의 된 메서드 .equals ()를 호출합니다.

public boolean equals2 (Object object2) {if (a.equals (object2)) {// 여기서 재정의 된 메서드를 호출하고 있으므로 false가 2 번 발생합니다. true를 반환하십시오. } 그렇지 않으면 false를 반환합니다. }


1
아니요, a.equals문자열의 방법이며 어디에서나 재정의되지 않습니다.
Tarec 2014 년
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.