【源码】Set集合源码剖析
注:以下源码基于jdk1.7.0_11
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集合源码剖析相关推荐
- 【JDK源码】集合源码目录,冲冲冲
集合源码直达,冲冲冲 [JDK源码]集合之ArrayList [JDK源码]集合之LinkedList [JDK源码]集合之解决ArrayList线程不安全 [JDK源码]集合之CopyOnWrite ...
- java hashset 源码_Java集合源码分析-HashSet和LinkedHashSet
前两篇文章分别分析了Java的ArrayList和LinkedList实现原理,这篇文章分析下HashSet和LinkedHashSet的源码.重点讲解HashSet,因为LinkedHashSet是 ...
- java地图源码_Java集合源码分析(四)HashMap
一.HashMap简介 1.1.HashMap概述 HashMap是基于哈希表的Map接口实现的,它存储的是内容是键值对映射.此类不保证映射的顺序,假定哈希函数将元素适当的分布在各桶之间,可为基本操作 ...
- Java集合源码分析(二)ArrayList
ArrayList简介 ArrayList是基于数组实现的,是一个动态数组,其容量能自动增长,类似于C语言中的动态申请内存,动态增长内存. ArrayList不是线程安全的,只能用在单线程环境下,多线 ...
- Java语法理论和面经杂疑篇《七. 数据结构与集合源码》
目录 1. 数据结构剖析 1.1 研究对象一:数据间逻辑关系 1.2 研究对象二:数据的存储结构(或物理结构) 1.3 研究对象三:运算结构 1.4 小结 2. 一维数组 2.1 数组的特点 2.2 ...
- 面试官系统精讲Java源码及大厂真题 - 12 彰显细节:看集合源码对我们实际工作的帮助和应用
12 彰显细节:看集合源码对我们实际工作的帮助和应用 更新时间:2019-09-17 10:19:41 劳动是一切知识的源泉. --陶铸 本节中,我们先跳出源码的视角,来看看集合类的类图,看看在设计层 ...
- 源码 解析_最详细集合源码解析之ArrayList集合源码解析
从今天开始我会将集合源码分析陆陆续续整理,写成文章形成集合源码系列文章,方便大家学习 ArrayList集合源码其实相对比较简单,整个源码结构相对于HashMap等源码要好理解的多:先来看下Array ...
- spark 源码分析之八--Spark RPC剖析之TransportContext和TransportClientFactory剖析
spark 源码分析之八--Spark RPC剖析之TransportContext和TransportClientFactory剖析 TransportContext 首先官方文档对Transpor ...
- 前端集合删除对象_【两万字】面试官:听说你精通集合源码,接我二十个问题!...
问题一:看到这个图,你会想到什么? (PS:截图自<编程思想>) 答: 这个图由Map指向Collection的Produces并不是说Map是Collection的一个子类(子接口),这 ...
- 小程序源码:游戏扫码登录多功能工具箱集合
这是一款由多功能集合的一款微信小程序源码 该小程序无需服务器,无需域名所有功能都无需API接口,所以也不用担心功能失效 具体功能由以下功能组合 游戏扫码登录(N款热门游戏支持扫码登录如王者荣耀,和平精 ...
最新文章
- windows下mysql慢查询开启的操作流程
- cocos2d 屏幕適配_cocos2d-x 2.x屏幕适配基础
- listview刷新,延迟加载,用单行刷新取代notifyDataSetChanged
- iOS FMDB官方使用文档 G-C-D的使用 提高性能(翻译)(转)
- bzoj 2178 圆的面积并 —— 辛普森积分
- STM32项目(七) —— 智能仓库管理系统
- syslog-ng记录history日志
- Grunt学习笔记001---grunt使用步骤和总结
- double、float、long占几个字节?
- macOS上简便好用的看图软件分享
- DDR扫盲——DDR中的名词解析
- Ubuntu 访问共享文件夹
- 二进制转bcd码c语言程序,二进制转8421BCD码的算法
- 登录失败:禁用的当前账户——window共享的傻X问题
- 全方面对比流行报表开发工具,哪一个才是你的菜?
- 创业公司天使轮、A轮、B轮……IPO融资时如何分配股权?
- mysql的where子查询_MySQL where型子查询
- substr() 方法
- android怎么设置图片缩放比例,Android按比例缩放图片
- 计算机开始菜单打不开是什么原因,电脑开始菜单打不开怎么办_win7开始菜单点击无效解决方法...