자바 String 클래스 의 hashCode()함수

5804 단어 java String
1===equals()
==두 대상 이 같은 메모리 주 소 를 가리 키 는 지 비교 합 니 다.
equals()방법 은 두 대상 의 값 이 같 는 지 여 부 를 판단 한다.
2 String.equals()
String 클래스 는 equals()방법 에 대해 다음 과 같이 다시 씁 니 다.
 1     public boolean equals(Object anObject) {

 2         if (this == anObject) {

 3             return true;

 4         }

 5         if (anObject instanceof String) {

 6             String anotherString = (String) anObject;

 7             int n = value.length;

 8             if (n == anotherString.value.length) {

 9                 char v1[] = value;

10                 char v2[] = anotherString.value;

11                 int i = 0;

12                 while (n-- != 0) {

13                     if (v1[i] != v2[i])

14                             return false;

15                     i++;

16                 }

17                 return true;

18             }

19         }

20         return false;

21     }

String,StringBuffer 및 StringBuilder 는 서로 같 지 않 습 니 다().필요 하 다 면 contentEquals()를 사용 하 십시오.
3 String.hashCode()
대상 값 이 같은 지 판단 할 때 hashCode 가 같은 지 먼저 판단 합 니 다.hashCode 가 같 지 않 으 면 equals()방법 으로 false 를 되 돌려 줍 니 다.그렇지 않 으 면 다시 비교 해 보 자.
jvm 기본 hashCode 가 같 지 않 으 면 대상 값 도 같 지 않 습 니 다.그 역명 제 는 대상 값 이 같 으 면 hash Code 도 같다 는 것 이다.
equals()를 다시 쓸 때 hashCode()도 다시 써 야 합 니 다.또한 값 이 같은 대상 에 게 동일 한 hashCode 가 있 음 을 보증 해 야 합 니 다.
 1     public int hashCode() {

 2         int h = hash;

 3         if (h == 0 && value.length > 0) {

 4             char val[] = value;

 5 

 6             for (int i = 0; i < value.length; i++) {

 7                 h = 31 * h + val[i];

 8             }

 9             hash = h;

10         }

11         return h;

12     }

hash 값 의 계산 방식 은 대략 이 모양 입 니 다.
hash(k) = mix(k) mod m

String 클래스 중:
mix(k) = 31 * k

여기 마법 숫자 가 31 을 선택 한 이 유 는:
*여기 hash 는 int 형 이 고 m=2^p 가 있 습 니 다.여기 서 마법 숫자 가 2 의 배수 일 때 String 대상 의 마지막 자 리 를 제외 하고 다른 비트 의 정 보 는 hash 가 홀수 통 에 들 어 갈 수 없습니다.즉,String 대상 의 마지막 분 포 는 해시 함수 의 분 포 를 결정 한다.이로써 마법 숫자 는 m 와 공약수 가 있어 서 는 안 된다 고 추정 할 수 있다.
* 소 수 는 산열 의 분 포 를 더욱 고 르 게 할 수 있다.
*곱 하기 31 은 계산 이 간단 합 니 다.한 번 에 자 리 를 옮 기 고 한 번 에 뺄셈 을 하면 됩 니 다.
*31 은 26 보다 큰 소수 중 가장 작다.작 을 수록 넘 칠 가능성 이 낮다.
여기 서 1,3,4 의 의 미 는 자 현 된 것 이 고 2 는 아직 명확 한 증명 이 없다.
개인 적 으로 홀수 라면 모두 가능 하 다 고 생각한다.

좋은 웹페이지 즐겨찾기