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
. equals
JavaDoc 에서 다음과 같이 말합니다 .
일반적
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 == object2
및 a.equals(object2)
모두는 항상 돌아갑니다false
있기 때문에 a
A는 string
동안은 object2
의 인스턴스이다MyClass