HashSet
内部是直接使用HashMap
来实现的是一种变体的
装饰器模式
add() :
元素
放到 HashMap 的 key
,value
放入一个常量 PRESENT
remove():
value
是否等于 PRESENT
private transient HashMap<E,Object> map;
// Dummy value to associate with an Object in the backing Map
private static final Object PRESENT = new Object();
public boolean add(E e) {
return map.put(e, PRESENT)==null;
}
public boolean remove(Object o) {
return map.remove(o)==PRESENT;
}
Q:突然发现,很多集合的方法,入参都是使用 Object,而不是泛型,这是为什么?
Q:那为什么 add() 的时候需要使用泛型?
参考:为什么Map.containsKey()方法的参数类型是Object?
LinkedHashSet 直接继承 HashSet
// dummy只是用来区别不同的构造,本身并没用
HashSet(int initialCapacity, float loadFactor, boolean dummy) {
map = new LinkedHashMap<>(initialCapacity, loadFactor);
}
TreeSet 也是直接使用 TreeMap
private transient NavigableMap<E,Object> m;
private static final Object PRESENT = new Object();
public TreeSet() {
this(new TreeMap<E,Object>());
}
原文:https://www.cnblogs.com/demojie/p/12596170.html