LinkedHashSet的图表如下:
LinkedHashSet是HashSet的子类,底层实现为:数组+双向链表。
LinkedHashSet也具有去重功能,并且元素是有序的。
构造方法如下:
执行空构造
LinkedHashSet<Object> hashSet = new LinkedHashSet<>();
分析:
/** * Constructs a new, empty linked hash set with the default initial * capacity (16) and load factor (0.75). */ public LinkedHashSet() { super(16, .75f, true); //调用父类(HashSet)的构造器 }
创建了一个LinkedHashMap,初始容量16,加载因子0.75
HashSet(int initialCapacity, float loadFactor, boolean dummy) {
map = new LinkedHashMap<>(initialCapacity, loadFactor);
}
public LinkedHashMap(int initialCapacity, float loadFactor) {
super(initialCapacity, loadFactor);
accessOrder = false;
}
public HashMap(int initialCapacity, float loadFactor) {
if (initialCapacity < 0)
throw new IllegalArgumentException("Illegal initial capacity: " +
initialCapacity);
if (initialCapacity > MAXIMUM_CAPACITY)
initialCapacity = MAXIMUM_CAPACITY;
if (loadFactor <= 0 || Float.isNaN(loadFactor))
throw new IllegalArgumentException("Illegal load factor: " +
loadFactor);
this.loadFactor = loadFactor;
this.threshold = tableSizeFor(initialCapacity); //这里计算出来=16
}
调用 hashSet.add(123); 添加元素,会执行以下方法,底层也是走的hashMap的put方法
public boolean add(E e) { return map.put(e, PRESENT)==null; }
// 以下方法的添加逻辑同上一篇博客,这里略过
/** * Implements Map.put and related methods * * @param hash hash for key * @