《Java源码分析》:HashSet
来源:互联网 发布:网络诈骗案例大全 编辑:程序博客网 时间:2024/05/20 07:33
说明:我们都知道HashSet集合是不允许重复元素的,因此这个类的利用什么来保证这个集合里面不会有重复的元素呢?结论是:HashSet是借助于HashMap的key不允许重复这个特性来实现的。想想这个思想确实比较奇妙,是吧,HashMap是操作键值对,而HashSet是操作HashMap的key完成相关操作,或者这么说,HashSet全部的操作是借助于HashMap经过某种封装得到的
下面来开始具体的分析,其实,如果我们了解HashMap的内部实现,HashSet的内部实现就相当的容易理解。
1、HashSet的继承结构
- 1
- 2
- 3
HashSet继承了AbstractSet抽象类,也实现了Set、Cloneable和Serializable接口。
或许你可能有这样的疑惑:AbstractSet实现了Set接口,HashSet既要继承AbstractSet还需要实现Set接口呢??
如果你看过HashMap的源码,HashMap的继承结构和HashSet类似,,为了方便比较,还是贴一下:
- 1
- 2
- 3
在HashMap我们已经探讨了为什么AbstractMap实现了Map接口,HashMap又继承AbstractMap还要实现Map接口呢??
这个问题在HashMap源码分析中已经有了答案,因此,HashSet的继承结构为什么如此,我想原因应该是一样的,HashSet之所以还实现Set接口,在功能上没有任何作用,仅仅只是使结构体系更加清晰完整。
2、HashSet的属性和构造函数
从下面可以看出,HashSet有一个HashMap的引用,且有一个常量。
HashSet的构造函数,都是创建一个map实例对象。HashSet对象的默认大小与HashMap默认大小一样,是16,且大小只能是2的幂次方。
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
3、HashSet中常见的一些方法
3.1、 add(E e)
源码如下:
- 1
- 2
- 3
- 4
看到这个源码是不是很爽,太简单了哈,就是将要添加的元素作为map的key,常量PRESENT作为value保存在HashMap对象中即可。有一点需要我们注意的是:这个add方法有返回值,返回值有map的put方法决定,当map调用put(key,value)方法时,如果存在key后,则map的put方法会返回此key对应的oldValue。此时add就会返回false
3.2、 iterator()
HashSet并没有提供类似于get的方法,只提供的获取访问元素的迭代器对象。iterator方法也是委托给了map,获取map的key集合的迭代器。
- 1
- 2
- 3
- 4
3.3、 其它的方法
其它方法的源码如下,全部都是委托给HashMap来实现的,是不是很简单哈,这里就不再过多的进行分析。
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
小结
确实比较简单哈,关于HashSet的内部实现我们只需要记住一点:是基于HashMap来实现的,即所有方法都是委托给HashMap对象来实现的;在使用方面,也只需要记住一点:所有Set集合对象存储的元素是不允许重复的哈
- 《Java源码分析》:HashSet
- 《Java源码分析》:HashSet
- Java数据结构源码分析-HashSet
- Java源码分析之HashSet
- java源码分析之HashSet
- java源码分析之HashSet及LinkedHashSet
- java 源码分析之HashSet及LinkedHashSet
- Java集合系列之HashSet源码分析
- java-HashMap和HashSet源码分析
- java源码分析之HashSet及LinkedHashSet
- java源码分析之HashSet和LinkedHashSet
- java HashSet HashMap(源码分析)
- Java集合---HashSet的源码分析
- Java集合---HashSet的源码分析
- Java基础——HashSet源码分析
- java集合(5):HashSet源码分析
- Java集合---HashSet的源码分析
- Java集合---HashSet的源码分析
- Leetcode 263 Ugly Number
- 如何去除浏览器的滚动条
- MXNET笔记(一)基本流程
- Targe Lock
- JS和jquery获取各种屏幕的宽度和高度的代码
- 《Java源码分析》:HashSet
- 第一次知道有拆白这种行业
- HDU 6201 transaction transaction transaction (Dijstra, 2017 ACM/ICPC Asia Regional Shenyang Online)
- react-native demo
- Leetcode 202 Happy Number
- windows 获取当前进程所占内存
- 推荐一款http调试工具抓包charles
- MATLAB如何提取矩阵的子块
- OpenGL初学:安装配置与第一个程序