TreeSet
数据结构
TreeMap,K用于存储元素,V用于存储一个固定的静态对象PRESENT
class TreeSet<E> extends AbstractSet<E>{
private transient NavigableMap<E,Object> m;
private static final Object PRESENT = new Object();
public TreeSet() {
this(new TreeMap<>());
}
public TreeSet(Comparator<? super E> comparator) {
this(new TreeMap<>(comparator));
}
}
操作
add(E)操作
向TreeMap存放键值对<K, PRESENT>
remove(E)操作
从TreeMap中移除该K
iterator()操作
从TreeMap中获取KeySet,调用KeySet.iterator()方法
HashSet
数据结构
HashMap,K用于存储元素,V用于存储一个固定的静态对象PRESENT
class HashSet<E> extends AbstractSet<E>{
private transient HashMap<E,Object> map;
private static final Object PRESENT = new Object();
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);
}
}
操作
add(E)操作
向HashMap存放键值对<K, PRESENT>
remove(E)操作
从HashMap中移除该K
iterator()操作
从HashMap中获取KeySet,调用KeySet.iterator()方法
小结
TreeSet封装一个TreeMap
HashSet封装一个HashMap
因为元素存储Map.Entry的Key,能够保障元素不重复
因为HashMap和TreeMap本身存储Key不是顺序存储,所以TreeSet和HashSet也能保证不是顺序存储