ProgramingTip

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

bestdevel 2020. 10. 23. 08:11
반응형

.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")가 왜 그렇습니까?


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

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

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

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

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


참고 : 재정의 경우 equals거의 항상 재정이 필요합니다 . JavaDoc 에서 다음과 같이 사실 .hashCodeequals

일반적 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처럼 동일한 결과를 제공합니다.


쓰기 쓰기 함수는 () 잘못되었습니다. "a"는 문자열 클래스 의 인스턴스 이고 "object2"는 MyClass 클래스 의 인스턴스입니다 . 클래스가 다르라고 대답은 "거짓"입니다.


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

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

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


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

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

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


기본 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 + '\'' +
            '}';
}
}

"=="연산자는 두 참조가 메모리에서 객체를 반환합니다. 반면에 () 메서드는 객체의 내용에 따라 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는 메소드를 사용하여 동일한 내용을 두개의 공유 비교 : true == 연산자를 사용하여 동일한 공유를 두 참조 비교 : true

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


클래스는 동일한 기능을 달성하기 위해 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");
        }
    }
}

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

boolean b = objectA.equals(objectB);

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


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

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

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


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


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

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


 /** Comparing two or more variables. Here the two items are compared and it will return a boolean true or false.
 * 
 * @return equals
 */
public boolean equals(Object item)
{
    String emp1 = this.toString();
    String emp2 = item.toString();
    return emp1.equals(emp2);
}

@Override
//In case you have more than one variable.
public String toString()
{
    return a + b;
}

// a and b represent the variables to display.

참고 URL : https://stackoverflow.com/questions/13387742/compare-two-objects-with-equals-and-operator

반응형