一开始有看源码的时候,最先看的是set,点进源码之后才看到,set内部是用map实现的,花了几天时间看了集中map源码,看完之后也会忘,但是还是有很大收获,读源码的道路还是要继续下去。
HashSet
HashSet继承了AbstractSet,实现了Set、Cloneable、Serializable接口。
HashSet内部的实现方式是HashMap
public HashSet() {
map = new HashMap<>();
}
但是set只有value,没有key,所以用了一个final类型的Object作为value
private static final Object PRESENT = new Object();
对set的操作过程都是调用hashMap的方法。
LinkedHashSet
LinkedHashSet继承HashSet,实现了Set、Cloneable、Serializable接口。
LinkedHashSet内部也没有特别的方法,直接使用了父类HashSet的三个参数的构造方法方法
HashSet(int initialCapacity, float loadFactor, boolean dummy) {
map = new LinkedHashMap<>(initialCapacity, loadFactor);
}
也就是说,LinkedHashSet内部是以LinkedHashMap实现的。
TreeSet
TreeSet继承AbstractSet,实现了NavigableSet、Cloneable、Serializable接口。
TreeSet内部使用了TreeMap实现
public TreeSet() {
this(new TreeMap<E,Object>());
}
总结
- HashSet内部通过HashMap实现,具有HashMap的性质。
- LinkedHashSet内部通过LinkedHashMap实现,具有LinkedHashMap的性质。
- TreeSet内部通过TreeMap实现,具有TreeMap性质。
JDK版本1.8.0_92。