why equals 다시 쓸 때hashcode 다시 쓰는 방법 공유

2160 단어 javaequalshashcode

public boolean equals(Object anObject) {
    if (this == anObject) {
        return true;
    }
    if (anObject instanceof String) {
        String anotherString = (String)anObject;
        int n = count;
        if (n == anotherString.count) {
        char v1[] = value;
        char v2[] = anotherString.value;
        int i = offset;
        int j = anotherString.offset;
        while (n-- != 0) {
            if (v1[i++] != v2[j++])
            return false;
        }
        return true;
        }
    }
    return false;
    }


public int hashCode() {
    int h = hash;
    if (h == 0) {
        int off = offset;
        char val[] = value;
        int len = count;

            for (int i = 0; i < len; i++) {
                h = 31*h + val[off++];
            }
            hash = h;
        }
        return h;
    }

그럼 왜 equals 방법을 다시 쓸 때 equals 방법을 다시 써야 합니까? 우선 equals와hashcode 간의 관계는 다음과 같습니다.
1. 만약 두 대상이 같다면 (즉, equals를 비교하여true를 되돌려준다면,hashCode 값은 반드시 같아야 한다.
2. 만약 두 대상의hashCode가 같다면 반드시 같지는 않을 것이다 (즉, equals를 비교하여false를 되돌려준다)
자기의 이해: 프로그램의 효율을 높이기 위해hashcode 방법을 실현했기 때문에hashcode의 비교를 먼저 한다. 만약에 다르다면 equals의 비교를 할 필요가 없다. 그러면 equals의 비교를 크게 줄일 수 있다.
횟수, 이 비교가 필요한 수량의 효율 향상은 매우 뚜렷하다. 좋은 예는 바로 집합에서 사용하는 것이다.
우리는 모두 자바의List 집합이 질서정연하다는 것을 알고 있기 때문에 중복할 수 있고 set 집합은 무질서하기 때문에 중복할 수 없다. 그러면 어떻게 중복된 원소를 넣지 못할 것을 보장할 수 있겠는가. 그러나 equals 방법과 같이 비교할 수 있다
만약에 원래 집합 중 이후에 10000개의 원소가 추가된다면 10001개의 원소를 넣고 앞의 모든 원소를 비교하여 중복이 있는지 확인해야 한다. 오코가의 효율은 짐작할 수 있기 때문에hashcode
만날수록 자바는hash표를 사용하고 해시 알고리즘(산열 알고리즘)을 이용한다. 바로 대상 데이터를 이 대상의 특징에 따라 특정한 알고리즘을 사용하여 하나의 주소에 정의하는 것이다. 그러면 뒤에 정의된 데이터는
대응하는hashcode 주소에 값이 있는지 확인하면 equals로 비교하고, 없으면 직접 삽입하면 equals의 사용 횟수를 크게 줄이고 실행 효율을 크게 높일 수 있다.
위의 화제를 계속하려면 왜 해시코드 방법을 다시 써야 합니까? 사실 간단하게 말하면 같은 대상을 확보하기 위해서입니다. 만약에 해시코드 값이 반드시 같을 것입니다. 만약에 해시코드 값을 다시 썼지만 다시 쓰지 않았다면
hashcode 방법, 관계가 없는 두 개의 대상 equals가 같은 (equal은 모두 대상의 특징에 따라 다시 쓰기 때문에) 나타날 수 있지만, hashcode는 확실히 다르다

좋은 웹페이지 즐겨찾기