자바 HashSet 의 실현 원리
HashSet 은 Set 인 터 페 이 스 를 실현 하고 해시 표 (실제 HashMap 인 스 턴 스) 가 지원 합 니 다.set 의 교체 순 서 를 보장 하지 않 습 니 다.특히 이 순서 가 영원히 변 하지 않 는 다 는 것 은 보장 되 지 않 는 다.null 요 소 를 사용 할 수 있 습 니 다.
2. HashSet 의 실현:
HashSet 의 경우 HashMap 을 바탕 으로 이 루어 진 것 입 니 다. HashSet 바 텀 은 HashMap 을 사용 하여 모든 요 소 를 저장 하기 때문에 HashSet 의 실현 은 비교적 간단 합 니 다. 관련 HashSet 의 조작 은 대체적으로 바 텀 HashMap 의 관련 방법 을 직접 호출 하여 이 루어 집 니 다. HashSet 의 소스 코드 는 다음 과 같 습 니 다.
public class HashSet<E>
extends AbstractSet<E>
implements Set<E>, Cloneable, java.io.Serializable
{
static final long serialVersionUID = -5024744406713321676L;
// HashMap HashSet 。
private transient HashMap<E,Object> map;
// Object HashMap value, static final。
private static final Object PRESENT = new Object();
/**
* , HashSet。
*
* HashMap, 16 0.75。
*/
public HashSet() {
map = new HashMap<E,Object>();
}
/**
* collection set。
*
* 0.75
* collection HashMap。
* @param c set collection。
*/
public HashSet(Collection<? extends E> c) {
map = new HashMap<E,Object>(Math.max((int) (c.size()/.75f) + 1, 16));
addAll(c);
}
/**
* initialCapacity loadFactor HashSet。
*
* HashMap。
* @param initialCapacity 。
* @param loadFactor 。
*/
public HashSet(int initialCapacity, float loadFactor) {
map = new HashMap<E,Object>(initialCapacity, loadFactor);
}
/**
* initialCapacity HashSet。
*
* loadFactor 0.75 HashMap。
* @param initialCapacity 。
*/
public HashSet(int initialCapacity) {
map = new HashMap<E,Object>(initialCapacity);
}
/**
* initialCapacity loadFactor 。
* , , LinkedHashSet 。
*
* LinkedHashMap 。
* @param initialCapacity 。
* @param loadFactor 。
* @param dummy 。
*/
HashSet(int initialCapacity, float loadFactor, boolean dummy) {
map = new LinkedHashMap<E,Object>(initialCapacity, loadFactor);
}
/**
* set 。 。
*
* HashMap keySet key。
* HashSet , HashMap key ,
* value static final Object 。
* @return set Iterator。
*/
public Iterator<E> iterator() {
return map.keySet().iterator();
}
/**
* set (set )。
*
* HashMap size() Entry , Set 。
* @return set (set )。
*/
public int size() {
return map.size();
}
/**
* set , true。
*
* HashMap isEmpty() HashSet 。
* @return set , true。
*/
public boolean isEmpty() {
return map.isEmpty();
}
/**
* set , true。
* , set (o==null ? e==null : o.equals(e))
* e , true。
*
* HashMap containsKey key。
* @param o set 。
* @return set , true。
*/
public boolean contains(Object o) {
return map.containsKey(o);
}
/**
* set , 。
* , set (e==null ? e2==null : e.equals(e2))
* e2, set e。
* set , set false。
*
* key HashMap。
* HashMap put() key-value , HashMap Entry key
* Entry key (hashCode() , equals true),
* Entry value Entry value, key ,
* HashSet , HashMap ,
* , Set 。
* @param e set 。
* @return set , true。
*/
public boolean add(E e) {
return map.put(e, PRESENT)==null;
}
/**
* set , 。
* , set (o==null ? e==null : o.equals(e)) e,
* 。 set , true
* ( : set , true)。( , set )。
*
* HashMap remove Entry。
* @param o set 。
* @return set , true。
*/
public boolean remove(Object o) {
return map.remove(o)==PRESENT;
}
/**
* set 。 , set 。
*
* HashMap clear Entry 。
*/
public void clear() {
map.clear();
}
/**
* HashSet : 。
*
* HashMap clone() , HashMap , HashSet 。
*/
public Object clone() {
try {
HashSet<E> newSet = (HashSet<E>) super.clone();
newSet.map = (HashMap<E, Object>) map.clone();
return newSet;
} catch (CloneNotSupportedException e) {
throw new InternalError();
}
}
}
3. 관련 설명:
1) HashMap 의 실현 원리 에 대해 서 는 지난 번 의 정 리 를 참고 하 시기 바 랍 니 다.
자바 HashMap 의 실현 원리.
2) HashSet 에 저 장 된 대상 에 대해 서 는 equals 와 hashCode 방법 을 정확하게 재 작성 하여 넣 은 대상 의 유일 성 을 확보 하 십시오.
참고:http://zhangshixi.iteye.com/blog/673143
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Is Eclipse IDE dying?In 2014 the Eclipse IDE is the leading development environment for Java with a market share of approximately 65%. but ac...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.