JDK의 소스 코드를 읽기 (VI) : HashMap의 소스 코드 분석

최근, 많은 사람들이 나에게 정보를 더 소스를 추가하지 요청했습니다

사실, 가장 공식 문서를 참조하는 것입니다, 중국 온라인 API 문서는 웹 사이트를 참조 할 수있다, 결국, 그것은 결함이 영어입니다

blog.fondme.cn/apidoc/jdk-...

두려워하는이 힘을 강요하지 않는, 빨간색으로 의도적으로 글꼴 패키지 P를 내 얼굴을 볼 수 없습니다

참고 텍스트가 시작 : JDK 버전 1.8

HashMap1.8 매우 다른 소스 1.8 전에

  • 디렉토리
    • 간략한 소개
      • 데이터 구조
    • 클래스 구조
    • 재산
    • 생성자
    • 부가
    • 삭제
    • 수정
    • 개요

1.HashMap 프로필

해시 테이블에 기초하여지도의 HashMap 인터페이스는 키 - 값 저장소의 형태로 존재한다. (동기의 사용을 허용하고 외부 NULL이 아닌 이외에, 해시 테이블의 HashMap 클래스는 거의 동일하다.)
구현의 HashMap이 동기화되지 않고, 안전하게 스레드되지 않는다는 것을 의미한다. 그것은 열쇠, 값은 널 (null)이 될 수 있습니다. 또한, HashMap의 매핑은 질서 없습니다. JDK1.8에서의 HashMap는 내부 데이터 구조 등의 레드 - 블랙 트리를 추가 + + 레드 - 블랙 트리 연결리스트의 배열로 구성되어, 구조가 복잡하게하지만, 효율이 더욱 효율적이된다.

1.2 HashMap의 데이터 구조

JDK1.8에서의 HashMap는 내부 데이터 구조 등의 레드 - 블랙 트리를 추가 + + 레드 - 블랙 트리 연결리스트의 배열로 구성되어, 구조가 복잡하게하지만, 효율이 더욱 효율적이된다. 값이지도에 저장 될 때 그는 계산 된 키의 값을 기준으로 할 때

해시의 충돌이 연결리스트로 저장하는 경우 해시, 해시는 배열의 위치에 의해 확인되는 在Object源码分析中解释过목록이 너무 긴 경우, 그러나, HashMap의 목록이 저장되어있는 레드 - 블랙 트리로 변환됩니다.

저장 구조의 HashMap의보기의 어떤 시점에 따라

소스 Google 검색

이 구조가되지 더 이상의 문제가있는 경우 그러나 질문, 왜 HashMap의 레드 - 블랙 당신은 그것을 사용하려면 트리입니까? ?

나는 사실, 레드 - 블랙 트리의 대부분은 실현이 문제를 조사 할 때 신경 내가 사용해야하는 이유, 나 또한 글을 쓰는 시점에서 버스트 궁금 무시,이 문제에 대해 생각하지 않았다. 임계 값이 8 인 이유 참고 예 온라인, 그러나 또한 설명 :

소자 초기화 맵은 성능 룩업 O (N)는 상기 터브 체인에 저장되기 때문에, 트리 구조는 O 성능 (로그 (N))를 찾아 낼 수있다. 체인 길이도 트래버스, 아주 어렸을 때, 속도는 매우 빠르지 만 체인의 길이가 될 때 트리로 전환 할 필요가 있으므로 이상, 확실히 충격 쿼리 성능을해야합니다, 계속합니다. 임계 값은 8, 내가 생각하는 이유에 관해서는, 답을 찾을 수있는 소스 코드는 가장 신뢰할 수있는 방법이어야한다.

참조 주소 : dwz.cn/nPFXmXwJ

2. 클래스 구조

의 클래스 구조를 살펴 보자

매우 혼란의 HashMap가 AbstractMap 상속하고 AbstractMap 클래스는 Map 인터페이스를 구현하는 문제가 있었다 때 소스 코드를 읽는에서 ArrayList의에서이 같은 구조는 LinkedList의입니다.

프레임 워크 조쉬 블로흐 설명 자바 컬렉션의 창시자에 따르면,이 표현은 실수입니다. 이 많은 것 작성된 자바 컬렉션 프레임 워크, 대부분은 그가 그 잘못 깨달았다 때까지 그는 도움이 될 수있는 몇 가지 장소에서 썼다 믿고 자바 컬렉션 프레임 워크를 쓰기 시작했다. 명백한, JDK 수비수 후 수정할 가치가이 작은 실수를 생각하지 않기 때문에 그래서 거기입니다.

  • Cloneable를 빈 인터페이스는 복제를 나타냅니다
  • 직렬화 직렬화
  • AbstractMap 인터페이스를 제공하는지도를 구현

3. 등록

초기 용량 ( 2의 거듭 제곱이어야합니다 )

최대 용량의 컬렉션 ( 2의 거듭 제곱이어야 )

하중 계수, 기본 0.75

값이 초과하면 8 목록은 레드 - 블랙 트리 (집니다 1.8 새을 )

목록의 값 미만인 경우 (6)은 블랙 트리 목록에서 반전됩니다

숫자지도 내부에이 값을 초과하는 경우, 테이블은 오히려 나무의보다 배럴당 너무 많은 요소, 갈등의 선택의 나무가이 값보다 작을 수 없습니다 확장을 방지하기 위해 때 그렇지 않으면 확장 될 것입니다, 나무의 배럴이 될 수 있습니다 4 * TREEIFY_THRESHOLD

건설 항에있어서,

나는 생성자를보고하기 시작했다.

4.1 의 HashMap ()

추천

출처juejin.im/post/5d1b0692f265da1baf7d054e