public boolean equals(Object obj) {
return (this == obj);
} // Object의 주소값을 이용해 비교한다.
equals() 메서드를 재정의하는 것은 보기에 쉬워보이지만 잘못된 방법으로 재정의할 경우 심각한 결과를 초래할 수 있다.
Thread. 각 스레드가 독립적이고 유일한 존재를 나타내기 때문에, equals 메서드를 재정의할 필요가 없다. 스레드는 참조에 따라 유일성을 유지하므로, 기본 equals 구현이 적절하다.논리적 동등성 검사를 제공할 필요가 없는 경우equals를 재정의했고, 슈퍼클래스의 동작이 이 클래스에 적합한 경우private 또는 패키지-private이고, equals 메서드가 호출될 일이 없는 경우equals 메서드를 재정의하여 호출되는 것을 방지할 수 있다.논리적 동등성 개념을 가지는 경우value class의 경우 해당된다.value class는 Integer, String과 같이 단순하게 value를 나타내는 클래스이다.equals를 재정의하지 않은 경우enum 타입과 같은 클래스는 인스턴스가 하나만 존재한다.Object의 기본 equals 메서드가 논리적 동등성을 표현하는 데 적합하다. enum 타입은 이러한 예로, 각 enum 상수는 고유하며 인스턴스가 하나만 존재하므로 기본 equals 메서드를 사용할 수 있다.equals 메서드를 재정의할 때 지켜야 할 contract가 있다.
null 이 아닌 x, y, z 에 대해서
equals 비교에 사용되는 정보가 변경되지 않은 경우에 한한다.객체의 해시 코드 값을 반환하는데 사용되는 메서드이며, 이는 해시 기반의 자료구조에서 중요한 역할을 한다.
자바에서의 해시코드는 객체를 식별할 수 있는 고유한 값을 의미한다. 메모리에 생성된 객체의 주소를 정수로 변환한 형태를 얘기하는데, 이 정수는 중복되지 않는 고유의 값이다.
equals() 메서드를 재정의한 클래스는 hashCode() 메서드 또한 반드시 재정의 해야 한다.
hashCode 메서드를 여러 번 호출할 때, 객체의 상태가 equals 비교에 사용되는 정보가 수정되지 않는 한, 항상 같은 정수 값을 반환해야 한다. 즉, 객체의 상태가 변하지 않는 한, hashCode 값은 일관되게 유지되어야 한다.equals 메서드에 의해 동등하다고 판단될 때, 이 두 객체의 hashCode 메서드는 반드시 같은 정수 값을 반환해야 한다. 즉, x.equals(y)가 true인 경우, x.hashCode()와 y.hashCode()는 동일한 값을 반환해야 한다.equals 메서드에 의해 동등하지 않다고 판단될 때, 이 두 객체의 hashCode 메서드가 반드시 다른 정수 값을 반환할 필요는 없다. 그러나, 서로 다른 해시 값을 반환하면 해시 테이블의 성능이 향상될 수 있다. 즉, 비동등한 객체들이 서로 다른 해시 값을 가지면 해시 테이블의 충돌을 줄여 성능을 개선할 수 있다. 밑에서 이어서 설명한다.equals 메서드를 통해 동등하지 않다고 판단되는 경우 hashCode 메서드 또한 다른 값을 반환하게 하면 해시 기반 컬렉션에서 성능이 향상된다. 이는 밑의 그림과 같은 동작방식을 거치기 때문이다.