博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【源代码】Set集合源代码剖析
阅读量:5946 次
发布时间:2019-06-19

本文共 2140 字,大约阅读时间需要 7 分钟。

注:下面源代码基于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
map;//内部封装了HashMap // Dummy value to associate with an Object in the backing Map private static final Object PRESENT = new Object();//值固定为new Object /*构造器照搬HashMap的*/ public HashSet() { map = new HashMap<>(); } public HashSet(Collection
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
m; // Dummy value to associate with an Object in the backing Map private static final Object PRESENT = new Object(); TreeSet(NavigableMap
m) { this.m = m; } public TreeSet() {//内部是TreeSet this(new TreeMap
()); } public TreeSet(Comparator
comparator) { this(new TreeMap<>(comparator)); } public TreeSet(Collection
c) { this(); addAll(c); } public TreeSet(SortedSet
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集合实际应用的非常少,大家知道原理就可以。

你可能感兴趣的文章
Struts上路_09-数据类型转换
查看>>
定制CentOS
查看>>
Android Eclipse 修改默认查看图片的打开方式
查看>>
CMake与动态链接库(dll, so, dylib)
查看>>
myeclipse(eclipse)乱码处理
查看>>
SpringBoot 过滤器, 拦截器, 监听器 对比及使用场景
查看>>
数据库索引探索
查看>>
MYSQl left join 联合查询效率分析
查看>>
struts2使用json需要注意的问题
查看>>
客户端的socket是否需要bind?
查看>>
Comparator进行排序
查看>>
IOS自动进行View标记
查看>>
cookie 和session 的区别详解
查看>>
Tomcat访问日志详细配置
查看>>
get请求传递中文参数乱码解决方法
查看>>
苦战 自由软件的今生前世
查看>>
搭建 Discuz 论坛
查看>>
Go语言的国际化支持(资源文件翻译)
查看>>
install oracle 11g on linux (centos6) 遇到的问题
查看>>
PhoneGap插件开发流程
查看>>