HashSet
底层JDK代码
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 HashSet() {
map = new HashMap<>();
}
// 这个是add部分的代码
public boolean add(E e) {
return map.put(e, PRESENT)==null;
}
先建立的是一个Hash Map的对象,然后将我们的Set值填入这个Key的位置,再把Value的部分用一个Object的对象进行填充,这样就可以的到一个Set的对象的基本结构,实际上就是调用HashMap的对象,有点难以想象
这样也是说明了为什么他会无法重复的原因
public void clear() {
map.clear();
}
他的许多用法都是直接调用map的方法
代码实现展示
public class myHashSet2<E> {
private static final Object ob = new Object() ;
HashMap<E, Object> map;
public myHashSet2() {
map = new HashMap<E, Object>();
}
public void append(E key) {
map.put(key, ob);
}
@Override
public String toString() {
StringBuilder sb = new StringBuilder();
sb.append('[');
map.keySet();
for (E ss : map.keySet()) {
sb.append(" "+ss+ ",");
}
sb.deleteCharAt(1);
sb.setCharAt(sb.length()-1, ']');
return sb.toString();
}
public static void main(String[] args) {
myHashSet2<Integer> a = new myHashSet2<Integer>();
a.append(12);
a.append(2322);
a.append(55);
System.out.println(a);
}
}
TreeMap
JDK底层源码
public TreeSet() {
this(new TreeMap<>());
}
public TreeSet(SortedSet<E> s) {
this(s.comparator());
addAll(s);
}
这个也是同样的方法,直接调用TreeMap来搭建Set部分