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<E,Object> map;  public HashSet(){map = new 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<E>extends HashSet<E>implements Set<E>, Cloneable, Serializable

 

空参构造过程:

 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<E>extends AbstractSet<E>implements NavigableSet<E>, Cloneable, Serializable

 

空参构造过程为:

TreeSet ts = new TreeSet();

-> this(new TreeMap<>());

->TreeSet(NavigableMap<E,Object> m) {this.m = m;}

m为 TressSet中的属性private transient NavigableMap<E,Object> m;m是一个map;

 

补充:

负载因子:initailCapacity*loadFactor=HashMap的容量。(HashMap实际存储的容量)负载因子越大则散列表的装填程度越高,也就是能容纳更多的元素,所以此时索引效率就会降低。

transient关键字:让对象中修饰的成员不被序列化;

 

从以上的简单的源码分析我们可以看出HashSet,LinkedHashSet,TreeSet的实现机制是通过相应的Map来构造的,固然相应的add方法会通过map的put方法实现的,对于更详细的实现机制,我们可以深入了解一个Map的实现机制,就会对Set有一个更近一层的理解。

 

如有问题,敬请指出,谢谢合作,与君共勉。