“==” 연산자로 비교를 한다.Object 클래스에는 equals() 메서드가 존재하는데 내부 구현을 보면 “==” 을 사용함을 알 수 있다.public boolean equals(Object obj) {
return (this == obj);
}
equals() 메서드를 재정의하는 것이 필요하다. 재정의는 인텔리제이 기능을 사용하면 되니 외울 필요는 없다.equals() 메서드를 오버라이딩하여 비교한다.package lecture.objects.inner;
import java.util.Objects;
public class MemberV2 {
private int memberId;
private String name;
private String email;
public MemberV2(int memberId, String name, String email) {
this.memberId = memberId;
this.name = name;
this.email = email;
}
@Override
public boolean equals(Object o) {
if (o == null || getClass() != o.getClass()) {
return false;
}
MemberV2 memberV2 = (MemberV2) o;
return memberId == memberV2.memberId && Objects.equals(name, memberV2.name) && Objects.equals(
email, memberV2.email);
}
@Override
public int hashCode() {
return Objects.hash(memberId, name, email);
}
}
equals() 을 재정의할 때 hashCode() 도 반드시 재정의 해야 한다. HashMap, HashSet같은 자료형에서는 Object 들을 해시할 때 Object.hashCode() 를 사용해 해시 값을 구하기 때문이다.true를 반환해야 한다.equals()의 결과는 항상 같아야 한다.x.equals(null)는 항상 false를 반환해야 함.여기서 등장하는 것이 이펙티브 자바에서도 언급하는 "hashCode()와 equals()함수를 재정의해라"이다. 반드시
hashCode() 함수는 자바의 최상위 클래스인 Object에서 정의가 되어있는데 그 내용은 다음과 같다.
public class Object {
public native int hashCode();
}
여기서 native는 C,C++로 작성되어(java로 작성되지 않음) JVM 내부의 네이티브 코드로 작성되어있다는 말이다. native method를 사용하는 이유는 다음과 같다.