자바 8 소스 - ashSet
4722 단어 자바 8 용기자바 8 용기 소스 코드 삿 포로
데이터 구조
HashSet 은 HashMap 에 의존 합 니 다.그래서 HashSet 의 데이터 구조 도 해시 표 + 링크 + 빨 간 검 은 나무 입 니 다.
HashSet 은 HashMap 에 의존 합 니 다.이 점 은 소스 코드 에서 분명하게 알 수 있다.
private transient HashMap map;
/*
* , 。
*/
public HashSet() {
map = new HashMap<>();
}
상단 설명
이러한 실현 Set 인 터 페 이 스 는 해시 표 (실제 HashMap 인 스 턴 스) 가 지원 합 니 다.set 의 교체 순 서 를 보장 하지 않 습 니 다.특히 이 순서 가 영원히 변 하지 않 는 다 는 것 은 보장 되 지 않 는 다.null 요 소 를 사용 할 수 있 습 니 다.
이러한 기본 작업 은 기본 작업 에 안정 적 인 성능 을 제공 합 니 다. 이러한 기본 작업 은 add, remove, contains 와 size 를 포함 하고 해시 함수 가 이러한 요 소 를 통 에 정확하게 분포 한다 고 가정 합 니 다.이 set 를 교체 하 는 데 걸 리 는 시간 은 HashSet 인 스 턴 스 의 크기 (요소 의 수량) 와 바 텀 HashMap 인 스 턴 스 (통 의 수량) 의 '용량' 과 비례 합 니 다.따라서 교체 성능 이 중요 하 다 면 초기 용량 을 너무 높 게 설정 하지 마 십시오 (또는 로드 인 자 를 너무 낮 게 설정 하지 마 십시오).
이 실현 은 동기 화 되 지 않 음 을 주의 하 세 요.여러 스 레 드 가 동시에 해시 set 에 접근 하고 그 중 하나 이상 의 스 레 드 가 이 set 를 수정 했다 면 외부 동기 화 를 유지 해 야 합 니 다.이것 은 보통 이 set 를 자 연 스 럽 게 패키지 한 대상 에 대해 동기 화 작업 을 통 해 이 루어 진다.이러한 대상 이 존재 하지 않 는 다 면 Collections. synchronizedSet 방법 으로 set 를 포장 해 야 합 니 다.이 set 에 예상 치 못 한 동기 화 접근 을 방지 하기 위해 서 이 동작 을 만 드 는 것 이 좋 습 니 다: Set s = Collections. synchronizedSet (new HashSet (...);
이러한 iterator 방법 으로 되 돌아 오 는 교체 기 는 fail - fast 입 니 다. 교체 기 를 만 든 후 set 를 수정 하면 교체 기 자체 의 reove 방법 을 사용 하지 않 는 한 언제든지 변경 할 수 있 습 니 다. Iterator 는 Concurrent ModificationException 을 던 집 니 다.따라서 동시 다발 적 인 수정 에 직면 하여 교체 기 는 곧 완전히 실패 할 것 이 며 앞으로 특정한 불확실 한 시간 에 임 의적 인 불 확정 행위 가 발생 할 위험 을 무릅 쓰 지 않 을 것 이다.
교체 기의 빠 른 실패 행 위 는 보장 되 지 않 습 니 다. 일반적으로 동기 화 되 지 않 고 수정 되 는 지 에 대해 어떠한 딱딱 한 보증 도 할 수 없 기 때 문 입 니 다.빠 른 실패 교체 기 는 Concurrent ModificationException 을 던 지 려 고 최선 을 다 하고 있 습 니 다.따라서 이러한 교체 기의 정확성 을 높이 기 위해 이 이상 에 의존 하 는 프로그램 을 만 드 는 것 은 잘못된 방법 입 니 다. 교체 기의 빠 른 실패 행 위 는 bug 를 검사 하 는 데 만 사용 되 어야 합 니 다.
자바 Collections Framework 의 구성원 입 니 다.
@author Josh Bloch @author Neal Gafter @see Collection @see Set @see TreeSet @see HashMap @since 1.2
정의.
public class HashSet extends AbstractSet implements Set, Cloneable, java.io.Serializable
그 중에서 우 리 는 알 수 있다.
아래 그림 은 HashSet 의 클래스 구조 차원 그림 입 니 다.
어떻게 클래스 구조 도 를 볼 수 있 는 지 는 내 가 쓴 글 을 참고 할 수 있다.
eclipse - 계승 차원 도 보기 / 계승 실현 차원 도 보기
영역
/**
* HashSet HashMap , HashMap 。
*/
private transient HashMap map;
/**
* ,HashSet HashMap , HashMap 。HashMap , hashSet key, hashMap(key,value) value ?PRESENT value。
*/
private static final Object PRESENT = new Object();
구조 방법
HashSet 은 5 가지 구조 방법 이 있 습 니 다.
소스 코드 는 여기 서 보 여주 지 않 습 니 다. 소스 코드 에서 볼 수 있 듯 이 HashSet 은 HashMap 에 전적으로 의존 하고 거의 자신의 것 이 있 습 니 다.
총 결 도 하지 않 고 주요 한 점 은 모두 문장의 시작 과 [상단 주석] 에 있다.
본 고 는 이미 자바 8 용기 소스 코드 삿 포로 칼럼 에 수록 되 었 다.