자바 8 소스 - ashSet

오늘부터 HashSet 공부 해 요.HashSet 은 HashMap 에 의존 하 는 Set 인터페이스의 실현 으로 사실상 HashMap 의 실례 이다.HashMap 소스 코드 에 익숙 하 다 면 HashSet 을 배 우 는 것 은 간단 하 다.HashSet 의 특징 은 set 의 교체 순 서 를 보장 하지 않 습 니 다. 특히 이 순서 가 영원히 변 하지 않 고 null 요 소 를 사용 할 수 있 습 니 다.본 고 는 데이터 구조, 실현 원리, 소스 코드 등 여러 측면 에서 HashSet 을 상세 하 게 설명 할 것 이다.
데이터 구조
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: TreeMap 은 요 소 를 저장 합 니 다.
  • extends AbstractSet: AbstractSet 을 계승 하여 Set 인 터 페 이 스 를 실현 할 때 실현 해 야 할 작업량 이 크게 줄 었 습 니 다.
  • implements Set: Set 를 실현 하고 Set 에서 설명 한 조작 set 의 기본 방법 을 실현 했다.
  • implements Cloneable: clone () 방법 으로 인 스 턴 스 의 field - for - field 복사 본 을 되 돌려 줄 수 있 음 을 나타 낸다.
  • implements 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 가지 구조 방법 이 있 습 니 다.
  • Public HashSet (): 새로운 빈 set 를 구성 합 니 다. 그 밑 에 있 는 HashMap 인 스 턴 스 의 기본 초기 용량 은 16 이 고 로드 인 자 는 0.75 입 니 다.
  • Public HashSet (Collection extends E > c): 지정 한 집합 c 의 요 소 를 포함 하 는 새로운 set 를 구성 합 니 다.기본 로드 인자 0.75 와 지정 한 집합 c 의 모든 요 소 를 포함 할 수 있 는 초기 용량 을 사용 하여 HashMap 을 만 듭 니 다.
  • Public HashSet (int initial Capacity, float loadFactor): 새로운 빈 set 를 구성 합 니 다. 그 밑 에 HashMap 인 스 턴 스 는 지정 한 초기 용량 initial Capacity 와 지정 한 로드 인자 loadFactor 를 가지 고 있 습 니 다.
  • HashSet (int initialCapacity): 새로운 빈 set 를 구성 합 니 다. 그 밑 에 있 는 HashMap 인 스 턴 스 는 지정 한 초기 용량 initialCapacity 와 기본 로드 인자 (0.75) 를 가지 고 있 습 니 다.
  • HashSet (int initial Capacity, float loadFactor, boolean dummy): 새로운 빈 set 를 만 듭 니 다.이 구조 방법 은 링크 드 HashSet 에 만 사용 된다.

  • 소스 코드 는 여기 서 보 여주 지 않 습 니 다. 소스 코드 에서 볼 수 있 듯 이 HashSet 은 HashMap 에 전적으로 의존 하고 거의 자신의 것 이 있 습 니 다.
    총 결 도 하지 않 고 주요 한 점 은 모두 문장의 시작 과 [상단 주석] 에 있다.
    본 고 는 이미 자바 8 용기 소스 코드 삿 포로 칼럼 에 수록 되 었 다.

    좋은 웹페이지 즐겨찾기