Java集合之 Set

92 阅读2分钟

Set对应于数学概念上的集合,集合中的元素是不可重复的

HashSet

使用HashMap来确保元素不重复

public class HashSet<E> extends AbstractSet<E> implements Set<E>, Cloneable, java.io.Serializable {
  	// 内部是通过HashMap实现的
    private transient HashMap<E,Object> map; 
    // 构造一个Object常量充当HashMap的Value
    private static final Object PRESENT = new Object();
    public int size() { return map.size();} 
    public boolean isEmpty() { return map.isEmpty(); }
    // 默认构造方法,通过创建新的HashMap实现Set去重功能 
    public HashSet() {
        map = new HashMap<>();
    } 
    public HashSet(Collection<? extends E> c) {
        map = new HashMap<>(Math.max((int) (c.size()/.75f) + 1, 16));
        addAll(c);
    } 
    public HashSet(int initialCapacity, float loadFactor) {
        map = new HashMap<>(initialCapacity, loadFactor);
    } 
    public HashSet(int initialCapacity) {
        map = new HashMap<>(initialCapacity);
    } 
    HashSet(int initialCapacity, float loadFactor, boolean dummy) {
        map = new LinkedHashMap<>(initialCapacity, loadFactor);
    } 
}

添加元素

直接调用HashMap的put方法,把元素e作为key,把PRESENT作为value

public boolean add(E e) {
    return map.put(e, PRESENT)==null;
}

删除元素

调用HashMap的remove方法

public boolean remove(Object o) {
    return map.remove(o)==PRESENT;
}

查找元素

调用HashMap的containsKey方法

public boolean contains(Object o) { 
    return map.containsKey(o); 
} 

TreeSet

默认基于TreeMap实现去重

public class TreeSet<E> extends AbstractSet<E> implements NavigableSet<E>, Cloneable, java.io.Serializable {
    // NavigableMap是一个接口类,默认通过TreeMap实现
    private transient NavigableMap<E,Object> m; 
    // 构造一个Object常量充当Map的Value
    private static final Object PRESENT = new Object();
    TreeSet(NavigableMap<E,Object> m) {
        this.m = m;
    }
    // 默认构造方法,构造一个TreeMap
    public TreeSet() {
        this(new TreeMap<E,Object>());
    } 
    public TreeSet(Comparator<? super E> comparator) {
        this(new TreeMap<>(comparator));
    } 
    public TreeSet(Collection<? extends E> c) {
        this();
        addAll(c);
    } 
    public TreeSet(SortedSet<E> s) {
        this(s.comparator());
        addAll(s);
    } 
    public int size() { return m.size(); } 
    public boolean isEmpty() { return m.isEmpty(); } 
}

添加元素

直接调用NavigableMap接口(默认实现是TreeMap)的put方法,把元素e作为key,把PRESENT作为value

public boolean add(E e) {
    return m.put(e, PRESENT)==null;
}

删除元素

调用NavigableMap接口(默认实现是TreeMap)的remove方法

public boolean remove(Object o) {
    return m.remove(o)==PRESENT;
}

查找元素

调用NavigableMap接口(默认实现是TreeMap)的containsKey方法

public boolean contains(Object o) { 
    return m.containsKey(o); 
} 

参考