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);
}