HashMap 소스 코드 의 비트 연산 자&상세 설명

머리말
최근 HashMap 소스 코드 를 읽 을 때 일반적인 연산 자 를 대체 하 는 연산 자가 많은 것 을 발견 했다.예 를 들 어 hash&(table.length-1)로 모드 연산 hash&(table.length)를 대체 합 니 다.확장 후 요소 의 위치 등 을 if(e.hash&oldCap)=0)로 판단 합 니 다.
1.취 모 연산 자%바 텀 원리
총 주지,비트 연산&직접 이 진 연산;한편,취 모 연산 자%:a%b 는 a-a/b*b 에 해당 하고 바 텀 은 실제 적 으로 제법 기 이 며 그 근원 을 따 져 보면 바 텀 의 감법 과 덧셈 이 공동으로 완성 된다.그래서 그 운행 효율 은 비트 연산 자&보다 훨씬 낮다.

2.비트 연산 자&어떻게 모델 링 기능 을 실현 합 니까?
우리 먼저 두 가지 예 를 보 자.
5 & 7                9 & 7
0101----5            1001----9
&                         &
0111----7             0111----7
=                          =
0101----5             0001----1
확실히 hash&(table.length-1)는 연산 hash&(table.length)를 2 진법 의 측면 에서 볼 때 5%8 은 실제로 2 진법 5(0101)를 오른쪽으로 3 자리 이동 시 키 고 7(0111)과 연산 을 하 는 것 은 사실상 세 자리 수 를 오른쪽으로 이동 시 키 는 것 이다.그러나 주의해 야 할 것 은 length 의 길이 가 2^n 일 때 만 결론 이 성립 된다 는 것 이다.
3.비트 연산 자&if(e.hash&oldCap)==0)에서 확장 후 요소 의 위 치 를 판단 합 니 다.
이것 은 JDK 1.8 에서 확장 함수 resize()의 한 줄 코드 에서 나 온 것 으로,확장 후 원래 배열 의 요소 가 이동 해 야 하 는 지 를 판단 하 는 데 사용 된다.예 를 들 어:
0001 1010----26                0000 1010----10                
&                              &
0001 0000----16                0001 0000----16
=                              =
0001 0000----비 0               0000 0000-----0
hash 값 과 oldCap 를 이용 하여 연산 을 하면 결과 가 0 이상 이면 hash 값 이 oldCap 보다 클 때 아래 표 시 된 위 치 는 구 배열 의 아래 표 j+oldCap 로 변 하 는 것 이 분명 합 니 다.결과 가 0 이 oldCap 보다 작 으 면 아래 표 시 된 위 치 는 변 하지 않 습 니 다.JDK 1.7 에서 각 원소 의 해시 값 을 다시 계산 하 는 것 보다 고위 연산(e.hash&oldcap)을 통 해 효율 이 높다.
HashMap 소스 코드 에 있 는 비트 연산 자&상세 한 설명 에 관 한 이 글 은 여기까지 소개 되 었 습 니 다.HashMap 소스 코드 에 있 는 비트 연산 자&내용 은 저희 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 찾 아 보 세 요.앞으로 많은 응원 부 탁 드 리 겠 습 니 다!

좋은 웹페이지 즐겨찾기