JDK8 소스 코드를 파싱 - HashMap의 (B)

  마지막으로 JDK8 소스 코드를 파싱 - HashMap의 (a)에 중요한 포인트에 대한 블로그는 이미 그것에 대해 이야기 해시 맵, 나는이 블로그의 콘텐츠 오늘의 일부에 대해 얘기하자, 나는 몇 가지를 넣어 것입니다 내 밖으로 던져 질문을 이해하지, 난 이해 왜 그런 이유로 올 수 있도록,이 블로그는 내 질문에 위대하신 하나님의 도움의 답을 고민보고 싶습니다. 서로 진행 상황과 서로 성장한다. jdk8 큰 버전으로 jdk7에서 HashMap의 변화는 새로운 노드 목록의 끝에 레드 - 블랙 트리를 사용하여 추가 2. 추가됩니다.

  1. HashMap의 용량 크기 평가 방법

// 2의 전원 복귀 
    정적  최종  INT tableSizeFor ( INT CAP) {
         INT = N-CAP를 1 -. ;
        N | = N >>> 1 ;
        N | = N >>> 2 ;
        N | = N >>> 4 ;
        N | = N >>> 8 ;
        N | = N >>> 16 ;
        반환 (N <0)? 1 : (N> = MAXIMUM_CAPACITY)? MAXIMUM_CAPACITY : N + 1 ;
    }

   (1) 왜 INT N = 캡이 필요하다 - 1이 일이?

            첫째, 우리는이 방법의 역할이 크기 용량의 입력 전력의 가장 최근의 값을 얻는 것입니다 이해할 필요가있다. 다음과 같은 작업이 아닌 16, 32 밖으로 획득 한 후, 16 후 인 매개 변수 캡을 통해 통과하자. 그래서 마이너스 하나가 필요합니다. 이 값을 수신하기 위해 2 개의 값의 최소 전력이다.

    받는 (2) 여기서 좌측 및 (31) = 1 + 2 + 4 + 16 + 8, 31 왜 여기?

             여기서 용량 형 INT 크기는 INT 크기는 32 비트 정수 2 <SUP> 31 </ SUP> -1의 최대치이다. (31)의 중간 이동 그래서. 감소 캡은 N 할당이 있다면, 결과가 상기 범위를 초과 할 것이다. 참고 최대 MAXIMUM_CAPACITY HashMap의 용량 = 1 << 30 것을 여기에 30이 아마도 그 왼쪽, (31), 상기 계산 된 값의 최악의 결과 인 경우 다음 때문에 더 이상 INT 1 <<< 32 인 비트의 가장 높은 숫자의 범위는 부호 비트를 위해 예약되어 있습니다.

  2. 빠른 고장 메커니즘 (르파)

      반복자 자체의 remove 메소드의에 결과 변경뿐만 아니라, 실패 빠른 메커니즘을 호출하므로 반복자는 ConcurrentModificationException를 throw합니다, 긴 해시 맵. 반복을 수행하는 필드가 변경되었는지 여부를 판단 할 때의 HashMap 구성 변화 기록 주파수가 필드의 modCount. 값이없는 경우 같은 예외가 발생합니다.

  3. 특징은 레드 - 블랙 트리

    (1) 노드가 적색 또는 흑색.

    (2) 루트는 검은 색입니다.

    자식 노드 (3) 레드 노드는 검은 색이다.

    (4) 각 리프 (NIL)를 검정한다.  

    (5) 각 경로의 모든 잎을 모든 노드에서 검은 동일한 수의 노드가 포함되어 있습니다.

참고 : 레드 아이 노드 노드가 빨간색 수 없습니다, 당신은 검은 색이어야합니다. 블랙 아이 노드 노드는 검은 색 빨간색 될 수있다.

 

질문을 예외 :

    1.HashMap 반복자는 방법의 가치를 얻을 수 있습니다? 예를 keySet 반환 () 메소드를 들어 아래 그림과 같이, 나는 달성하는 방법을 모르겠어요. 이 ValueSet의 HashMap (또한) 등이있다. 사람이 하나님의 원리를 알고 있다면, 내 코칭하시기 바랍니다. :)

 

추천

출처www.cnblogs.com/javJoker/p/12096082.html