1. equals 비교에 사용되는 정보가 변환되지 않았다면, app이 실행되는 동안 객체의 hashCode값은 항상 같아야 함
2. equals(Object)가 두 객체를 같다고 판단했다면, 두 객체의 hashCode는 똑같은 값을 반환해야 한다.
=> 논리적으로 같은 객체는 같은 해쉬코드값을 반환해야 함
3. equals(Object)가 두 객체를 다르다고 판단했더라도, 두 객체의 hashCode 값이 다를 필요는 없음
Java HashMap은 hash함수 적용할떄, hashCode값을 사용함으로 다른 두 객체가 hashCode값이 같다면 두 객체는 같은 인덱스로 해쉬됨(collision)으로 성능상 단점이 있음. (Jdk 8 hashMap:해시 키 값 충돌 시 separtate chaining 방식 사용)
Java에서 최상위 class인 Object의 final이 아닌 methode들 (equals, hashCode, toString ,clone, finalize)는 모두 overriding을 염두에 두고 설계된 것이라, overriding시 지켜야 하는 일반 규약이 명확하다.
1
publicbooleanequals(Object obj);
이 중에서 equals method는 == 연산자와 마찬가지로 참조변수의 참조값을 비교하도록 정의되어 있는데, 다음과 같은 상황에서는 overriding 하지 않는 것이 좋다.
1 2 3 4 5 6 7
1. 각 인스턴스가 고유한 경우 ex) Thread와 같이 객체가 값을 표현하는 목적이 아닌 경우
2. 인스턴스가 논리적으로 동일한지 검사할 일이 없는 경우
3. 상위 class에서 재정의한 equals가 하위 클래스에도 적합한 경우
4. 클래스가 private 이거나, package-private이고, equals method가 호출될 일이 없는 경우
여기서 객체 소멸자란 생성자와 정반대의 개념으로, 객체가 소멸될떄(GC될때) 자동으로 호출되는 함수이다.
Java 9에서부터는 finalizer를 사용 자제해야 할 API로 지정하고, cleaner를 그 대안으로 소개하였다. 하지만 책에서는 cleaner또는 finalizer의 사용을 피하라고 얘기하고 있다,.그렇다면 finalizer와 cleaner는 왜 사용하면 안될까?