注:以下源码基于jdk1.7.0_11

Set集合其实是对Map集合的封装,Map集合存储的是键值对,那么我们将值隐藏,不向外界暴露,这样就形成了Set集合。
对应Map集合的两个很重要的实现HashMap(基于哈希表),TreeMap(基于红黑树),Set集合也对应了两个类HashSet和TreeSet。由于之前花很多篇幅介绍了HashMap和TreeMap,在此将不再介绍其实现细节。
简单分析下HashSet:
static final long serialVersionUID = -5024744406713321676L;private transient HashMap<E,Object> map;//内部封装了HashMap// Dummy value to associate with an Object in the backing Mapprivate static final Object PRESENT = new Object();//值固定为new Object/*构造器照搬HashMap的*/public HashSet() {map = new HashMap<>();}public HashSet(Collection<? extends E> c) {map = new HashMap<>(Math.max((int) (c.size()/.75f) + 1, 16));addAll(c);}public HashSet(int initialCapacity, float loadFactor) {map = new HashMap<>(initialCapacity, loadFactor);}public HashSet(int initialCapacity) {map = new HashMap<>(initialCapacity);}HashSet(int initialCapacity, float loadFactor, boolean dummy) {map = new LinkedHashMap<>(initialCapacity, loadFactor);}

方法几乎没什么好讲的,全都是直接调用HashMap的方法。

  public boolean add(E e) {return map.put(e, PRESENT)==null;}

add方法插入的值为固定的new Object(). HashMap支持null键,HashSet自然也是支持的 。

 public boolean remove(Object o) {return map.remove(o)==PRESENT;}

TreeSet:

private transient NavigableMap<E,Object> m;// Dummy value to associate with an Object in the backing Mapprivate static final Object PRESENT = new Object();TreeSet(NavigableMap<E,Object> m) {this.m = m;}public TreeSet() {//内部是TreeSetthis(new TreeMap<E,Object>());}public TreeSet(Comparator<? super E> comparator) {this(new TreeMap<>(comparator));}public TreeSet(Collection<? extends E> c) {this();addAll(c);}public TreeSet(SortedSet<E> s) {this(s.comparator());addAll(s);}

这里需要注意的是,由于TreeSet不支持null键,故而TreeSet也是不支持null键的。这要跟HashSet区分开来。

    public boolean add(E e) {return m.put(e, PRESENT)==null;}public boolean remove(Object o) {return m.remove(o)==PRESENT;}

Set集合实际应用的很少,大家知道原理即可。

【源码】Set集合源码剖析相关推荐

  1. 【JDK源码】集合源码目录,冲冲冲

    集合源码直达,冲冲冲 [JDK源码]集合之ArrayList [JDK源码]集合之LinkedList [JDK源码]集合之解决ArrayList线程不安全 [JDK源码]集合之CopyOnWrite ...

  2. java hashset 源码_Java集合源码分析-HashSet和LinkedHashSet

    前两篇文章分别分析了Java的ArrayList和LinkedList实现原理,这篇文章分析下HashSet和LinkedHashSet的源码.重点讲解HashSet,因为LinkedHashSet是 ...

  3. java地图源码_Java集合源码分析(四)HashMap

    一.HashMap简介 1.1.HashMap概述 HashMap是基于哈希表的Map接口实现的,它存储的是内容是键值对映射.此类不保证映射的顺序,假定哈希函数将元素适当的分布在各桶之间,可为基本操作 ...

  4. Java集合源码分析(二)ArrayList

    ArrayList简介 ArrayList是基于数组实现的,是一个动态数组,其容量能自动增长,类似于C语言中的动态申请内存,动态增长内存. ArrayList不是线程安全的,只能用在单线程环境下,多线 ...

  5. Java语法理论和面经杂疑篇《七. 数据结构与集合源码》

    目录 1. 数据结构剖析 1.1 研究对象一:数据间逻辑关系 1.2 研究对象二:数据的存储结构(或物理结构) 1.3 研究对象三:运算结构 1.4 小结 2. 一维数组 2.1 数组的特点 2.2 ...

  6. 面试官系统精讲Java源码及大厂真题 - 12 彰显细节:看集合源码对我们实际工作的帮助和应用

    12 彰显细节:看集合源码对我们实际工作的帮助和应用 更新时间:2019-09-17 10:19:41 劳动是一切知识的源泉. --陶铸 本节中,我们先跳出源码的视角,来看看集合类的类图,看看在设计层 ...

  7. 源码 解析_最详细集合源码解析之ArrayList集合源码解析

    从今天开始我会将集合源码分析陆陆续续整理,写成文章形成集合源码系列文章,方便大家学习 ArrayList集合源码其实相对比较简单,整个源码结构相对于HashMap等源码要好理解的多:先来看下Array ...

  8. spark 源码分析之八--Spark RPC剖析之TransportContext和TransportClientFactory剖析

    spark 源码分析之八--Spark RPC剖析之TransportContext和TransportClientFactory剖析 TransportContext 首先官方文档对Transpor ...

  9. 前端集合删除对象_【两万字】面试官:听说你精通集合源码,接我二十个问题!...

    问题一:看到这个图,你会想到什么? (PS:截图自<编程思想>) 答: 这个图由Map指向Collection的Produces并不是说Map是Collection的一个子类(子接口),这 ...

  10. 小程序源码:游戏扫码登录多功能工具箱集合

    这是一款由多功能集合的一款微信小程序源码 该小程序无需服务器,无需域名所有功能都无需API接口,所以也不用担心功能失效 具体功能由以下功能组合 游戏扫码登录(N款热门游戏支持扫码登录如王者荣耀,和平精 ...

最新文章

  1. windows下mysql慢查询开启的操作流程
  2. cocos2d 屏幕適配_cocos2d-x 2.x屏幕适配基础
  3. listview刷新,延迟加载,用单行刷新取代notifyDataSetChanged
  4. iOS FMDB官方使用文档 G-C-D的使用 提高性能(翻译)(转)
  5. bzoj 2178 圆的面积并 —— 辛普森积分
  6. STM32项目(七) —— 智能仓库管理系统
  7. syslog-ng记录history日志
  8. Grunt学习笔记001---grunt使用步骤和总结
  9. double、float、long占几个字节?
  10. macOS上简便好用的看图软件分享
  11. DDR扫盲——DDR中的名词解析
  12. Ubuntu 访问共享文件夹
  13. 二进制转bcd码c语言程序,二进制转8421BCD码的算法
  14. 登录失败:禁用的当前账户——window共享的傻X问题
  15. 全方面对比流行报表开发工具,哪一个才是你的菜?
  16. 创业公司天使轮、A轮、B轮……IPO融资时如何分配股权?
  17. mysql的where子查询_MySQL where型子查询
  18. substr() 方法
  19. android怎么设置图片缩放比例,Android按比例缩放图片
  20. 计算机开始菜单打不开是什么原因,电脑开始菜单打不开怎么办_win7开始菜单点击无效解决方法...

热门文章

  1. IOCP的一些思考(粘包,断包的处理)
  2. 数据库基础_关系与关系模式
  3. 腾讯全球数字生态大会--散记
  4. addEventListener() 方法,事件监听
  5. 扩大eclipse的运行内存
  6. 使用C#进行蓝牙开发-接收BLE广播
  7. 云计算如何从谷歌诞生的?
  8. pwm一个时间单位_「硬见小百科」什么是PWM“死区”?
  9. linux中如何安装windows
  10. nrf51822 52832学习汇总