HashMap의 원칙 (A) 개념과 기본 아키텍처

HashMap의 <문자열, 정수> = mapData 새로운 HashMap의 <> ();

우리는 여기에서 소스 코드를 입력, 점차 HashMap에 노출

/ ** 
 * 디폴트의 초기 용량에 빈 <TT>의 HashMap </ TT> 구축 
 * (16)과 기본 부하 계수 (0.75). 
 * / 
공용의 HashMap () { 
    this.loadFactor = DEFAULT_LOAD_FACTOR; // 다른 모든 필드는 기본값 
}

우리는보기의 이름 지점에서, 두 변수 loadFactor 및 DEFAULT_LOAD_FACTOR를 발견하지 접수 loadFactor 매개 변수가 loadFactor에 기본값을 할당 할 수 있기 때문이다. 그것이 무엇을 의미하는지 결국이 두 가지 변수, 다른 변수가 없다?

사실, HashMap의에 정의 된 많은 변수와 정적 멤버 변수, 우리는 봐

//静态变量
정적 최종 INT의 DEFAULT_INITIAL_CAPACITY = 1 << 4; // 16 일명 

정적 최종 INT의 MAXIMUM_CAPACITY = 1 << 30; 

정적 최종 플로트 DEFAULT_LOAD_FACTOR 0.75f =; 

정적 최종 INT의 TREEIFY_THRESHOLD = 8; 

정적 최종 INT UNTREEIFY_THRESHOLD = 6; 

정적 최종 INT의 MIN_TREEIFY_CAPACITY = 64;
//成员变量
과도 노드 <K, V> [표] 

과도 집합 <의 Map.Entry <K, V >> entrySet; 

과도 INT의 크기; 

과도 INT의의 modCount; 

INT 임계 값; 

최종 플로트 loadFactor;

여섯 개 정적 변수 총 사실 추측 할 역할이 멤버 변수 및 방법과 관련된 조건의 판단 등의 기본 설정 값이고, 상수보다 적절한 불리는 초기 값으로 설정하고, 수정 번복되고 .

여섯 개 멤버 변수의 총, 멤버 변수는이 외에, 용량에서 중요한 개념이, 우리는 주로 테이블에 대해 이야기 entrySet는, 용량, 크기, 임계 값, loadFactor, 우리가 수행하는 작업에 대한 간략한 설명 우리.

1. 변수 테이블

해시 MAP 저장하기위한 데이터 구조를 기본 변수 테이블의 HashMap은 노드가 정적 내부 클래스, 배열 및리스트를 조합 한 복합 구조 키값 예, 노드 어레이에 추가, 우리는 노드 클래스 보면 :

정적 클래스 노드 <K는 V>의 Map.Entry <K, V> {구현 
    최종 INT 해시; 
    최종 K 키; 
    V 값; 
    노드 <K, V> 다음; 

    노드 (INT 해시 키 K, V 값 노드 <K, V> 다음) { 
        this.hash = 해시; 
        this.key = 키; 
        this.value = 값; 
        this.next = 다음; 
    } 

    공공 최종 K하는 getKey () {키 반환; } 
    공용 최종 V getValue () {반환 값; } 
    공공 최종 문자열 toString는 () {키 + "="+ 값을 반환; } 

    공공 최종 INT의 해시 코드 () { 
        Objects.hashCode (키) ^ Objects.hashCode (값)을 리턴; 
    }
        값 = NEWVALUE;
 
    공공 최종 V의의 setValue (V NEWVALUE) {
        V 값 = oldValue입니다; 
        oldValue입니다를 반환; 
    } 

    공공 최종 메소드의 개요 boolean equals (Object o) { 
        경우 (O ==이) 
            true를 반환; 
        경우 (O의 Map.Entry instanceof는) { 
            의 Map.Entry E = (의 Map.Entry <?>) O <?>; 
            경우 (Objects.equals (키 e.getKey ()) && 
                Objects.equals (값 e.getValue ())) 
                TRUE를 반환; 
        } 
        false를 반환; 
    } 
}

비유를 할 수있는 기회의 측면에서, 당신은 티켓 ID 번호입니다 (구입 해시 알고리즘 (에 의해 생성) 해시 ) 값이 기계를 얻기 위해 항공 좌석의 수의 값에 해당, 자신의 본성입니다 ( )을 다음 다음 사람의 시트 노드이다 ( 다음 (인력과 ID 번호, 좌석의 좌석 번호를 포함) 등의 시트 전체가이다) 테이블 의 테이블 작성 다수가, 노드 [] 테이블을 구성하고, 이 비행하는 작업.

왜 연결리스트 데이터 구조 배열과 조합을 사용할 수 있습니까?

그리고 우리는 배열이 쉽고, 상대적으로 어려운 삽입 삭제를 해결하는 장점과 단점, 지속적인 스토리지 어레이의 자신의 목록을 가지고 있음을 알고 목록에 몰래 저장되고, 상대적으로 어려운 주소, 쉽게 삽입 작업을 삭제할이 개되는 HashMap의 조합 종 데이터 구조는 JDK8가 나중에 섹션을 설명 TreeMap의 레드 - 블랙 트리, 레드 - 블랙 트리로 변환에 물론,리스트의 길이가 너무 깁니다, 각각의 장점을 유지, 자신의 단점을 구성합니다.

다음도 HashMap의 구성은 :

어떻게이 구조를 설명하기?

또는 시스템이 더 인간적 발권 경우 설명하기 위해 예를 활용하고 체크인 작업을 취소하기 위해, 티켓 통신의 여행을 용이하게하기 위해, 나이에 의해 구별된다, 연령의 다음 20 년 그룹 여섯 명 총으로 나누어 도 20a ~도 20f는, 20 ~ 30 세 그룹 21A ~ 21F 6 개인들로 분할하고, 30 ~ 40 세 컴포넌트 22A 6 개인으로 나누었다 ~ 22F, 40 ~ 50년 6 개인 그룹 23A 총 ~ 23F.

우리는 20 일 여동생을 찾고 있다면 그런 다음, 우리가 (21)의 행을 쉽게 찾을 수 있다는 것을 알고 아래로 시작 21A에서 찾고, 당신은 신속하게 찾을 수 있어야합니다.

나이별로 그룹화 관점에서 데이터, 후 (해시 값의 해시 알고리즘, 다른 해시 값 연령, 같은 나이와 동일한 해시 값이 얻어지는) 각 개인의 나이가 좌석에 착석 배열 표는 다음 사람이 오면, 자신의 배열에, 노르웨이 입력 한 첫 번째 사람, 그리고 첫 번째 사람의 다음 포인트가 될 것입니다.

2. 변수 entrySet

변수 정의 entrySet 변수 EntrySet 엔티티는의 Map.Entry,의 Map.Entry의 모음 생성되지 않도록 수회 반복 될 수있다 <K는 V> 인터페이스는 노드 클래스가 인터페이스를 구현하고, 그래서 처리는 EntrySet을 필요 데이터 조작은 노드 엔티티의 HashMap이다.

공개 설정 <의 Map.Entry <K, V >> entrySet () { 
    집합 <의 Map.Entry <K, V >> ES; 
    (ES = entrySet) == NULL을 반환? (entrySet = 새로운 EntrySet ()) : ES; 
}

3. 용량

용량 멤버 변수 아니지만, 그 용량을 의미하는 개념으로 사용된다 HashMap의 많은 곳에서, 이전에 언급 문서 잘 이해 두 상수이다 관련

/ ** 
 . 기본의 * 초기 용량 -의 전원 (2의 거듭 제곱이어야 함) 두 BE해야 
 * 예를 들어 16 기본 용량 : 일반 좌석에 해당하는 비행기에 사람의 수를, 
 * / 
. 정적 INT 최종 DEFAULT_INITIAL_CAPACITY 1 = . 4 <<; 16 // AKA는 
/ ** 
 * A가 COMMUNICAITIONS 영역 내재적으로 지정 값이있는 경우에 사용되는 최대 용량 
 . 인수 중 하나에 의해 * 생성자 함께에게 
 *의 힘이가되어야하는 두 <= 30. 1 << (2이어야 .의 힘, 그리고 1,073,741,824의 최대 용량)보다 클 수 없습니다 
 , 전송할 수) 재난 구호 요원이,이 시간에 (의 안전을 보장하기 위해 경우에 서 허용 할 때 그런 사람들의 수와 같은 긴급 상황에서 가능한 한 신속하게 대피 : * 예를 들어 
 * / 
최종 정적 INT MAXIMUM_CAPACITY = 1 << 30;

한편의 HashMap은 팽창기구, (2)의 전력 용량의 규칙을, 그 용량은 16, 32 ... 방법이 용량 규정을 달성 할 수 있는가?

/ ** 
 * 주어진 목표 용량이 개 크기의 힘을 돌려줍니다. 
 * / 
정적 최종 INT tableSizeFor INT (CAP) { 
    INT 캡 N = - 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; 
}

(2)의 가까운 전원으로 프로세스의 능력을 발견에 전달, 즉

캡 = 2, 2 반환;

캡 = 3,4 리턴;

캡 = 9, 16을 반환;

...

캡 자체 캡을 뺀 2의 거듭 제곱, 4가 아닌 경우, 최종 결과에 따라 통과 할 때 그 중 2 번 전송 될 중이기 때문에, 자신의 카운트, 제 캡 1 가동 값을 전달할 수있다 .

라인으로 라인, 우리가 계산 : tableSizeFor (11), 최종 규칙의 결과에 따르면 16을 얻어야한다

// 단계 : N = 10, 이진수 00001010로 변환된다 
. INT = N-CAP - 1; 
// 단계 : N-1 우측 높은 비트 0 (십진수 10 : 5 진수 : 00000101) 및 및 N 않거나 조작 (1 1 0 0)와, 그리고 N에 할당 (십진수 10 : 15 진수 : 00001111) 
N | >>> N = 1; 
// 번째 단계 : N 오른쪽 2,0의 상위 비트 (십진수 10 : 3 진수 : 00000011) 15 진수 : 및는 N 또는 (1 내지 1 0 0)와 함께 동작하고, N에 할당 (십진수 10 확인 00,001,111을 ) 
N | N = 2 >>>; 
// 4 단계 : 4 N 오른쪽 높은 비트 0 (10 진수 : 0 이진 : 00000000)을 구성하는 N-OR 연산 (1~1과 바이너리 15 : 00001111) 0 0) 후, (십진수 10에 N-할당된다 
. - | >>> 4 = N, N- 
N-8 오른쪽 높은 비트 0 (십진수 10 : 0 // 5 단계 진수 : 00000000), 0과 0)는 N-OR 연산 (1~1 확인한 후 N (소수 10에 할당 된 15 진 : 00001111) 
N | = N >>> 8]. 
// 단계 6 : N 16 비트 오른쪽 높은 비트 0 (10 진수 : 0 이진 : 00000000), 및 n-OR 연산 (1~1을, 0과 0으로 다음에 할당 된 N (10 진수 : 15 진수 : 00001111) 
N- | N - >>> = 16; 
// 7 단계 :. 창 1 + 15 = 16; 
창 (N- <0?) : 1 (N-.> ? = MAXIMUM_CAPACITY) MAXIMUM_CAPACITY : N + 1;

그 결과, 예상대로, 매우 빠른 하드웨어 알고리즘 아, ヽ (ー _이) 테크노는 읽을 수 있지만, 디자인이 나오지 않습니다.

4. 크기 가변

() 메소드가 removeNode () 메소드 위해서는 putValue를 호출이 변경됩니다, 그리고 당신이 할 수있는 구별 할 능력 때 크기 변수는지도에서 키 - 값 쌍의 수를 기록한다.

5. 임계 변수와 변수 loadFactor

중요 임계 값은, 정의에 의해, 당신이 뭔가를 할 필요가 임계로 근무하고 임계 값 HashMap의에서 "임계 값 = 용량 * loadFactor"는 확장과 관련하여 중요한 값의 HashMap을 초과하는 경우.

부하율에 loadFactor는 HashMap의 디폴트 값의 전체 범위를 측정하기 위해 사용된다 DEFAULT_LOAD_FACTOR 즉 0.75f를 생성자로 조정 파라미터를 전달할 수있다 (0.75f 매우 합리적인, 기본적으로 어떤 하나를 조정하는 것)는 물론 이해 예를 들어 :

100 시험 문제는, 부모가 당신을 테스트하기 위해 75 분을 필요로 당신이 좋아하는 컴퓨터를 구입주고, 부하 계수는 0.75,75 분 임계 값은이다; 경우 몇 년 후, 200 점으로 점수 질문이 시간 당신은 당신의 마음에 드는 컴퓨터를 얻기 위해 150 포인트를 테스트해야합니다.

개요

그 기본 데이터 구조가 소스 테이블 데이터와 복합 구조의 관점에서 분석되는 동안이 문서의 HashMap 용량 용량으로, 링크 된리스트, 키 - 값 쌍의 기록 횟수의 크기가 상기의 HashMap의 기본 개념을 설명 규칙의 용량은 2의 거듭 제곱을 따라서 loadFactor로드 임계치가 팽창한다 초과 임계 임계 값 정도의 전체 측정 값.

추천

출처www.linuxidc.com/Linux/2019-08/160021.htm