본문 바로가기
Delvelopment/Java

[Java] System.identityHashCode()와 hashCode() 차이

by 제제킴 2022. 1. 21.
반응형

System.identityHashCode()와 hashCode() 두 메서드 모두 객체의 고유한 값을 리턴한다.

  • System.identityHashCode()
    • 객체의 고유한 hashcode를 리턴하는 메소드이다.
  • hashCode()
    • 모든 객체의 부모 클래스인 Object 클래스에 정의되어있다.
void new연산자() {

        Member member = new Member("hello", "1");
        Member member2 = new Member("world", "2");
        Member member3 = new Member("hello", "1");

        System.out.println(System.identityHashCode(member)); //646204091
        System.out.println(System.identityHashCode(member2)); //445010547
        System.out.println(System.identityHashCode(member3)); //680306160
        
        System.out.println(member.hashCode()); //-1220935265
        System.out.println(member2.hashCode()); //-782084384
        System.out.println(member3.hashCode()); //-1220935265

    }

    record Member(
            String name,
            String id
    ) {

    }

System.identityHashCode()는 정의된 값이 같아도 객체의 고유한 hashcode를 출력하고 있다.

HashCode()는 Object 클래스에 정의된 것을 출력하기 때문에 같은 값이라면 같은 hashcode를 출력한다.

Constructor.java	

		/**
     * Returns a hashcode for this {@code Constructor}. The hashcode is
     * the same as the hashcode for the underlying constructor's
     * declaring class name.
     */
    public int hashCode() {
        return getDeclaringClass().getName().hashCode();
    }
String.java

		/**
     * Returns a hash code for this string. The hash code for a
     * {@code String} object is computed as
     * <blockquote><pre>
     * s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1]
     * </pre></blockquote>
     * using {@code int} arithmetic, where {@code s[i]} is the
     * <i>i</i>th character of the string, {@code n} is the length of
     * the string, and {@code ^} indicates exponentiation.
     * (The hash value of the empty string is zero.)
     *
     * @return  a hash code value for this object.
     */
    public int hashCode() {
        // The hash or hashIsZero fields are subject to a benign data race,
        // making it crucial to ensure that any observable result of the
        // calculation in this method stays correct under any possible read of
        // these fields. Necessary restrictions to allow this to be correct
        // without explicit memory fences or similar concurrency primitives is
        // that we can ever only write to one of these two fields for a given
        // String instance, and that the computation is idempotent and derived
        // from immutable state
        int h = hash;
        if (h == 0 && !hashIsZero) {
            h = isLatin1() ? StringLatin1.hashCode(value)
                           : StringUTF16.hashCode(value);
            if (h == 0) {
                hashIsZero = true;
            } else {
                hash = h;
            }
        }
        return h;
    }

Object의 hashCode() 메소드는 하위 클래스에서 override가 가능하기 때문에 객체마다 유일한 값을 갖고 있지 않는다.

객체의 특성이 동일하다는 것을 표현하기 위해 이 메소드를 오버라이드할 수 있다.

예를 들어, Member의 hashcode가 갖다면 객체는 달라도 문자열은 동일하다는 것을 의미한다.

System.identityHashCode()는 오버라이드가 안되고 객체의 고유한 hashCode를 리턴합니다.

객체 자체를 비교하려면 해당 메소드를 사용한다.

반응형

댓글