目录
1.HashSet
1.1HashSet整体架构
- 底层实现基于HashMap,使用了组合的方式把HashMap当成一个实例变量来实现
// 把 HashMap 组合进来,key 是 Hashset 的 key,value 是下面的 PRESENT
private transient HashMap<E,Object> map;
// HashMap 中的 value
private static final Object PRESENT = new Object();
1.2初始化源码解析
// 对 HashMap 的容量进行了计算
public HashSet(Collection<? extends E> c) {
map = new HashMap<>(Math.max((int) (c.size()/.75f) + 1, 16));
addAll(c);
}
c.size为当前的期望值,0.75为默认的扩容大小,进行加一是为了比扩容的临界值大于1,避免扩容
默认大小为16,要进行比较。
1.3增加源码解析
public boolean add(E e) {
// 直接使用 HashMap 的 put 方法,
// 不等于null说明HashMap进行了覆盖原有的值,key发生了重复
return map.put(e, PRESENT)==null;
}
ps:使用了策略模式,定义一系列的算法簇并且实现,来组合进主类里
2.TreeSet
2.1TreeSet整体架构
- 跟HashSet的大致结构类似,底层是用了TreeMap进行了组合(作为实例变量)
2.2增加源码解析
public boolean add(E e) {
return m.put(e, PRESENT)==null;
}
基于直接复用的方式
2.3迭代器方法
//直接复用的迭代器方法
public Iterator<E> descendingIterator() {
// 直接使用 HashMap.keySet 的迭代能力
return m.keySet().iterator();
}
// NavigableSet 接口,定义了迭代的一些规范,和一些取值的特殊方法
public interface NavigableSet<E> extends SortedSet<E> {
Iterator<E> iterator();
E lower(E e);
}
// m.navigableKeySet() 是 TreeMap 写了一个子类实现了 NavigableSet
// 接口,实现了 TreeSet 定义的迭代规范
public Iterator<E> iterator() {
return m.navigableKeySet().iterator();
}
descendingIterator方法采用了直接复用的方式来实现
iterator方法采用了另一种方法,自己定义了迭代的使用规范然后让TreeMap去具体实现
ps:使用了策略模式,定义一系列的算法簇并且实现,来组合进主类里