자바 常用 集合 : ArrayList를 / 벡터, LinkedList의;의 HashMap, HashSet의;의 LinkedHashMap, ConcurrentHashMap의

1.ArrayList / 벡터

ArrayList를 :
1. 확장으로 확장되지 1.5 배 (=으로부터 elementData Arrays.copyOf (의으로부터 elementData, newCapacity)의)
2. 동적 어레이 구조 자체는 (일시적으로 수정)의 시퀀스에 의해 실현 될 수없고, 따라서 내부 직렬화는 탐색들의 시퀀스의 각 요소.
있는 Vector :
1.Vector ArrayList를 내부 데이터 구조 등뿐만 아니라 데이터를 저장하기위한 동적 배열. 그러나, 동기화 된 기록 데이터의 사용은 부가 () 메소드를 동기화 할 수 있지만, 벡터는 동기화 된 용기는 용기 동시가 아닌 정도로 비용이 크다.
(동기 동시 : HTTPS : //blog.csdn.net/XM_no_homework/article/details/103888289)

2.LinkedList

LinkedList의는 기본 이중 연결리스트를 기반으로 구현 된
LinkedList의 삽입, 매우 높은 효율이며, 삭제 포인터를 이동합니다.
쿼리를 통과 할 필요를 찾기 덜 효율적이다.

3.HashMap

그림 삽입 설명 여기
HashMap의리스트 및 어레이 기반 하층이 달성된다. 두 가지 중요한 매개 변수가 있습니다 :

  • 생산 능력
  • 하중 계수

HashMap의 크기> 16 * 0.75 뜻 팽창이 발생 (용량 및 부하율을 자유롭게 조정할 수있다) 경우에 용량의 기본 크기는 부하율이 0.75, 16이다.

해시 충돌 :
어레이의 제한된 길이 때문에, 필연적으로 계산에 의해 얻어진 다른 키 인덱스 동일한있을 것이기 때문에, 이러한 상황은 링크 된리스트를 이용하여 해결 될 수 있으며, 링크 된리스트는 HashMap의 의지 [표 인덱스, 헤드 인서트를 사용하여 데이터의 보간에 형성된다 목록에.

넣어 () 및 GET () :
GET와 같은 넣어하지만,이 위치 key.equals (K)으로 대응하는 요소를 찾기 위해 전체리스트를 통과하는 연결리스트 필요가있는 경우에도 입력 키 인덱스가 계산된다.

JDK1.8에서 의 HashMap의 최적화 : 해시 충돌 목록을 작성 후 길이가 64 이하 길이 (또는 시간 확장)보다 목록이 레드 - 블랙 트리로 변환됩니다되는 임계 값 (기본값 8) 테이블을 초과 .

가정하자 해시 심각한 충돌 후 긴 목록 뒤에 배열 한 후 다시 시간 복잡도는 O (n)이된다.

레드 - 블랙 트리 경우 시간 복잡도는 O (logn).

크게 쿼리 효율성을 향상

4. HashSet의

HashSet의 내부 HashMap에 의해 실현, 반복 요소의 컬렉션을 저장할 수 없습니다

HashSet의 멤버 변수 :

    private transient HashMap<E,Object> map;

    // Dummy value to associate with an Object in the backing Map
    private static final Object PRESENT = new Object();

상기 값이 설정 첨가되어 (개인 정적 최종 개체 PRESENT = 새의 개체 ())
값이 기록되고, 따라서 보장 값을 덮어 것이다 HashSet에 중복되지만 키는 영향을받지 저장소에 HashSet의뿐만 아니라 요소를 반복했다.

5. Laidaked ः ashanap

의 LinkedHashMap의 HashMap하지만, 필요 정렬 장면이 해결하기 위해 주문을 기반으로.

그것은 이중 연결리스트로 구성, 부하의 HashMap 구현에서 상속됩니다.

의 LinkedHashMap 두 가지 유형의 정렬이 있습니다 :

정렬 쓰기 순서.
액세스 순서를 정렬합니다.
모바일 액세스 순차 값에 따라 상기 각각의 반복 동작이 정렬 된리스트의 액세스 순서에 따라 수득 할 수 있도록하는 것이,리스트의 끝에 액세스를 얻을 것이다.

사실의 LinkedHashMap은, 주문 보장하기 위해 이중 연결리스트를 사용하여, HashMap의 확장 된

6.ConcurrentHashMap

구조도 :
그림 삽입 설명 여기
세그먼트 HashEntry 조성물과의 HashMap의 ConcurrentHashMap의 배열로서 여전히 배열 플러스리스트이다.

액세스 세그먼트 HashEntry 세그먼트 (세그먼트) (ReentrantLock와에서 상속) 잠금 그런 다음 액세스

/**
 * Segment 数组,存放数据时首先需要定位到具体的 Segment 中。
 */
final Segment<K,V>[] segments;
transient Set<K> keySet;
transient Set<Map.Entry<K,V>> entrySet;

놓다()

키를 대상으로 먼저 세그먼트 (넣어) 더하기 고정 세그먼트 다음의 특정 세그먼트에 대응하는 듯
하지만 값이다 HashEntry 휘발성 키워드 변형되지만 수행 하지 보증 자성의 동시 씌워 작동 여전히 필요로 할 때 과정을 잠글 .

() 프로 시저를 넣어 :

  • 해시 코드 키를 통해 현재 대상 HashEntry에서 세그먼트 테이블.
  • 이 입력 키와 평등의 현재 탐색 키, 덮어 쓰기 이전 값과 동일한 것으로 판단 버리지 경우 HashEntry를 통과.
  • 비우고 먼저 용량이 필요한지 여부를 결정합니다 세그먼트 반면에 추가 HashEntry을 만들 필요가 없습니다입니다.
  • 마지막으로, 우리는 1에서 획득 한 현재의 잠금 세그먼트를 해제합니다

가져 오기()

() 잠겨 있지 얻을 특정 요소를 대상으로 다시 한번 해시, 해시를 통과 한 후 단순히 대상의 특정 세그먼트 키에.

인수 할 때 재산 HashEntry 휘발성 키워드의 값으로, 메모리의 가시성을 보장하기 위해 때마다 너무 최신 값을 수정됩니다.

전체 프로세스는 잠금을 필요로하지 않기 때문에 방법을 얻을 ConcurrentHashMap의 것은, 매우 효율적입니다

CAS +의 사용은 동시성의 안전을 보장하기 위해 동기화하면서 JDK1.8 원래 세그먼트 세그먼트 잠금에 버려진.

게시 28 개 원래 기사 · 원 찬양 24 ·은 10000 +를 볼

추천

출처blog.csdn.net/XM_no_homework/article/details/103888289