Skip to content

Latest commit

 

History

History
117 lines (99 loc) · 3.14 KB

HashSet.md

File metadata and controls

117 lines (99 loc) · 3.14 KB

HashSet 本身并没有什么特别的东西,它提供的所有集合核心功能,都是基于 HashMap 来实现的。如果了解 HashMap 源码的实现,HashSet 源码看起来跟玩一样。我的博客中有专门分析 HashMap 源码的文章,不熟悉的请自行翻阅。

HashSet 的特点如下:

  • 内部使用 HashMap 的 key 存储元素,以此来保证元素不重复
  • HashSet 是无序的,因为 HashMap 的 key 是无序的;
  • HashSet 中允许有一个 null 元素,因为 HashMap 允许 key 为 null;
  • HashSet 是非线程安全的。
publicclassHashSet<E> extendsAbstractSet<E> implementsSet<E>, Cloneable, java.io.Serializable { staticfinallongserialVersionUID = -5024744406713321676L; // 基于HashMap实现privatetransientHashMap<E,Object> map; // 只需要用到HashMap中key唯一的特性,所以value全部使用同一个 Object实例填充,节省内存空间privatestaticfinalObjectPRESENT = newObject(); /** * 实例化 HashSet 的时候,初始化内部的 HashMap */publicHashSet() { map = newHashMap<>(); } /** * 根据一个集合实例,实例化 HashSet */publicHashSet(Collection<? extendsE> c) { map = newHashMap<>(Math.max((int) (c.size()/.75f) + 1, 16)); addAll(c); } /** * 根据初始容量和扩容因子实例化 HashSet,减少rehash频率,提升性能,原理与HashMap相同 */publicHashSet(intinitialCapacity, floatloadFactor) { map = newHashMap<>(initialCapacity, loadFactor); } /** * 同上 */publicHashSet(intinitialCapacity) { map = newHashMap<>(initialCapacity); } HashSet(intinitialCapacity, floatloadFactor, booleandummy) { map = newLinkedHashMap<>(initialCapacity, loadFactor); } /** * 返回迭代器,用于迭代 * 下面所有的功能都是基于 HashMap 来实现的 */publicIterator<E> iterator() { returnmap.keySet().iterator(); } /** * 元素个数 */publicintsize() { returnmap.size(); } /** * 是否为空 */publicbooleanisEmpty() { returnmap.isEmpty(); } /** * 是否包含给定元素 */publicbooleancontains(Objecto) { returnmap.containsKey(o); } /** * 添加元素,如果 Set集合中未包含该元素,返回true */publicbooleanadd(Ee) { returnmap.put(e, PRESENT)==null; } /** * 删除元素,如果Set集合包含该元素,返回true */publicbooleanremove(Objecto) { returnmap.remove(o)==PRESENT; } /** * 清除元素 */publicvoidclear() { map.clear(); } /** * 浅克隆 */@SuppressWarnings("unchecked") publicObjectclone() { try { HashSet<E> newSet = (HashSet<E>) super.clone(); newSet.map = (HashMap<E, Object>) map.clone(); returnnewSet; } catch (CloneNotSupportedExceptione) { thrownewInternalError(e); } } }
close