HashSet内部使用HashMap来实现,HashMap类 继承AbstractSet 类,实现Map接口;
HashMap的基本操作有: add,remove,contains,size,clear,clone,isEmpty,iterator, …
HashMap的构造方法有:HashSet();HashSet(Collection extends E> c);HashSet(int initialCapacity);HashSet(int initialCapacity,float loadFactor);
构造函数详解:
HashSet()构建对象流程:
⑴当我们创建一个HashSet set = new Hash();
⑵private transient HashMap
⑶public HashMap(){this.loadFactor = DEFAULT_LOAD_FACTOR;}
static final float DEFAULT_LOAD_FACTOR = 0.75f;
static final int MAXIMUM_CAPACITY = 1 << 30;
因此当我们调用空参的HashMap()构造器创建对象时,他会创建一个默认初始容量是16,负载因子是0.75的HashMap对象.
public HashSet(Collection extends E> c)
同理,这个构造函数会构造一个包含指定集合中的元素的新集合。 HashMap使用默认负载因子(0.75)创建,初始容量足以包含指定集合中的元素。
public HashSet(int initialCapacity,float loadFactor)
这个构造函数会构造一个新的空集合; HashMap实例具有指定的初始容量和指定的负载因子。
public HashSet(int initialCapacity)
构造一个新的空集合; 后台HashMap实例具有指定的初始容量和默认负载因子(0.75)。
LinkedHashSet:
public class LinkedHashSet
空参构造过程:
LinkedHashSet linkedHashSet = new LinkedHashSet();
-> super(16,7.5f,true)
->HashSet中的HashSet(int initialCapacity ,float loadFactor,boolean dummy){map = new LinkedHashMap<>(initialCapacity,loadFacotry);}
->LinkeHashMap中的public LinkedHashMap(int initialCapacity, float loadFactor) {
super(initialCapacity, loadFactor);accessOrder = false;}
->HashMap中的public HashMap(int initialCapacity, float loadFactor) {…}
TreeSet :
public class TreeSet
空参构造过程为:
TreeSet ts = new TreeSet();
-> this(new TreeMap<>());
->TreeSet(NavigableMap
m为 TressSet中的属性private transient NavigableMap
补充:
负载因子:initailCapacity*loadFactor=HashMap的容量。(HashMap实际存储的容量)负载因子越大则散列表的装填程度越高,也就是能容纳更多的元素,所以此时索引效率就会降低。
transient关键字:让对象中修饰的成员不被序列化;
从以上的简单的源码分析我们可以看出HashSet,LinkedHashSet,TreeSet的实现机制是通过相应的Map来构造的,固然相应的add方法会通过map的put方法实现的,对于更详细的实现机制,我们可以深入了解一个Map的实现机制,就会对Set有一个更近一层的理解。
如有问题,敬请指出,谢谢合作,与君共勉。