자바 String 클래스 의 hashCode()함수
5804 단어 java String
==두 대상 이 같은 메모리 주 소 를 가리 키 는 지 비교 합 니 다.
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 는 아직 명확 한 증명 이 없다.
개인 적 으로 홀수 라면 모두 가능 하 다 고 생각한다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
자바 String 처리 입문 - null 또는 빈 값 의 판단 처리왜냐하면 그들의 문법 자 체 는 문제 가 없 기 때문에 자바 컴 파일 러 가 컴 파일 할 때 오 류 를 보고 하지 않 기 때문이다.그러나 이러한 조건 은 실행 할 때 프로그램 에 bug 가 나타 날 수 있 습 니 다...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.