讨厌深夜的原因是它有太多不稳定因素。
最近一直再看有关于集合方面的代码,给我个人的感触,如果你是有一定的数据结构知识等去看集合的源码,相对于理解起来的话,就会更好的名字,存储集合元素的数据结构。当然,这也不是一遍就能彻底的理解好的啦,就有个大致的理解的。最终的还是需要长期的使用不断的提升来加强这方面,这纯属个人的感觉。
先上一张HashSet的关系图吧
从这个图就不难看出HasetSet上面的关系。然后HashSet实现起来都是基于HashMap的,利用HashMap的Key的唯一性和不重复来确保的,所以这就是我们经常和面试官聊的HashSet是元素不重复,没有顺序的原因,因为HashMap的Key保存也是无序的.
1 : 参数介绍
// 保存数据的HashMap private transient HashMap<E,Object> map;// Dummy value to associate with an Object in the backing Map 翻译过来的意思就是 : 与备份映射中的对象关联的虚拟值private static final Object PRESENT = new Object();transient这个修饰符号,初次见到的时候也是搞不懂明白,后来百度就大致了解了作用,大致就是保证序列化的时候,被该字段修饰的,就不会被序列化,具体还是需要写代码去详细的体验看下效果是什么样子的。
2 : 构造函数
// 无惨构造函数;也就是初始化之前map public HashSet() { map = new HashMap<>(); }// 初始化一个map,然后调用addAll()方法来将数据都保存到map中 public HashSet(Collection<? extends E> c) { map = new HashMap<>(Math.max((int) (c.size()/.75f) + 1, 16)); addAll(c); }// 根据传入进来的数值大小,初始化一个Map public HashSet(int initialCapacity, float loadFactor) { map = new HashMap<>(initialCapacity, loadFactor); }// 同上 public HashSet(int initialCapacity) { map = new HashMap<>(initialCapacity); }// 根据传入进来的参数,初始化一个LinkedHashMap类型的Map HashSet(int initialCapacity, float loadFactor, boolean dummy) { map = new LinkedHashMap<>(initialCapacity, loadFactor); }
3 : 方法介绍
从下面的这些方法中可以看出,这些核心的方法,都是继续调用那个全局的Map的方法来实现的。
// 长度
public int size() { return map.size(); }// 根据长度来判断是否为空的 public boolean isEmpty() { return map.isEmpty(); }// 判断是否包含某个元素 public boolean contains(Object o) { return map.containsKey(o); }// 进行添加,Key 是传入进来的元素e , value 就是全局定义的Object对象 public boolean add(E e) { return map.put(e, PRESENT)==null; }// 移除某个元素 public boolean remove(Object o) { return map.remove(o)==PRESENT; }// 清空集合 public void clear() { map.clear(); }// 克隆某个元素 public Object clone() { try { HashSet<E> newSet = (HashSet<E>) super.clone(); newSet.map = (HashMap<E, Object>) map.clone(); return newSet; } catch (CloneNotSupportedException e) { throw new InternalError(e); } }// 调用迭代器,也就是调用HashMap中的方法 public Iterator<E> iterator() { return map.keySet().iterator(); }
好啦,HashSet的源码就是利用HashMap来实现的,当有面试官在问的时候,就说HashSet的唯一性是利用HashMap的Key来进行保证的。其实HashSet也就是利用HashMap来实现的。