容器学习六:HashSet & LinkedHashSet & TreeSet源码分析
?一.概述
???? Set是通过Map来支持的,Set接口里的所有方法,都委托给内部的Map去实现。
?
二.HashSet源码
public class LinkedHashSet<E> extends HashSet<E> //extends HashSet implements Set<E>, Cloneable, java.io.Serializable { private static final long serialVersionUID = -2851667679971038690L; public LinkedHashSet(int initialCapacity, float loadFactor) { super(initialCapacity, loadFactor, true); //dummy=true } public LinkedHashSet(int initialCapacity) { super(initialCapacity, .75f, true); } public LinkedHashSet() { super(16, .75f, true); } public LinkedHashSet(Collection<? extends E> c) { super(Math.max(2*c.size(), 11), .75f, true); addAll(c); }?四.TreeSet源码
???? 同HashSet一样的道理,就不贴代码了。
?
五.Set里面是否能存放null
???? 不必刻意去记,把前几篇分析Map的文章搞清楚了,很自然就知道了。
- HashMap允许插入null key,null value,所以HashSet可以插入null数据。Hashtable不允许插入null key,null value,如果一个Set用Hashtable去实现,那么这个Set不可以插入null数据。LinkedHashMap只是在HashMap基础上加了一个链表,所有的操作同HashMap,所以LinkedHashMap允许插入null key,null value,LinkedHashSet也就插入null数据。自然顺序时TreeMap不允许插入null key,容许插入null value,所以自然顺序时TreeSet不可以插入null数据。
?