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 원래 세그먼트 세그먼트 잠금에 버려진.