10. HashSet 소스 코드 분석
7685 단어 처음부터 자바 소스 를 배우 기 시 작 했 습 니 다.
2. 실현 방식 은 클래스 주석 에서 볼 수 있 듯 이 HashSet 의 실현 은 HashMap 을 바탕 으로 하 는 것 이 고 자바 에서 기초 류 를 바탕 으로 혁신 적 으로 실현 하려 면 두 가지 방법 이 있다.하 나 는 기초 류 를 계승 하고 기초 류 를 복사 하 는 방법 이다. 예 를 들 어 HashMap 을 계승 하고 add 방법 을 복사 하 는 것 이다.또 다른 방법 은 기초 류 를 조합 하여 기초 류 를 호출 하 는 방법 을 통 해 기초 류 의 능력 을 재 활용 하 는 것 이다.HashSet 은 후 자 를 사용 하고 조합 HashMap 을 통 해 제공 하 는 기능 을 사용 하 는데 그 장점 은 다음 과 같다.우선, 상속 은 부자 류 가 같은 사물 임 을 나타 내 고 Set 와 Map 은 두 가지 사물 을 표현 하기 때문에 계승 이 타당 하지 않 고 자바 문법 제한 으로 자 류 는 한 부모 류 만 계승 할 수 있 고 후속 적 으로 확장 하기 어렵다.그 다음으로 조합 이 더욱 유연 하고 기 존의 기초 류 를 임의로 조합 할 수 있 으 며 기초 류 방법 을 바탕 으로 확장, 편성 등 을 할 수 있 으 며 방법 명명 이 상대 적 으로 유연 하여 기초 류 의 방법 명칭 과 일치 하지 않 아 도 된다.구체 적 으로 소스 코드 를 실현 하 는 것 은 다음 과 같다.
public class HashSet<E> extends AbstractSet<E> implements Set<E>, Cloneable, java.io.Serializable{
// HashMap ,key Hashset key,value PRESENT
private transient HashMap<E,Object> map;
//HashMap value
private static final Object PRESENT = new Object();
}
소스 코드 분석
3. HashSet 초기 화 는 간단 합 니 다. new 를 직접 사용 하면 됩 니 다. 원본 집합 데이터 가 초기 화 된 경우 HashMap 의 초기 용량 을 계산 합 니 다. 소스 코드 는 다음 과 같 습 니 다.
public class HashSet<E> extends AbstractSet<E> implements Set<E>, Cloneable, java.io.Serializable{
// HashMap
public HashSet(Collection<? extends E> c) {
map = new HashMap<>(Math.max((int) (c.size()/.75f) + 1, 16));
addAll(c);
}
public boolean add(E e) {
// HashMap put ,
return map.put(e, PRESENT)==null;
}
}
소스 코드 분석