java高级——Collection集合之Set探索
- 前情提要
- 文章介绍
- 继承结构
- 底层代码(一张图你就悟了)
- 下期预告
前情提要
上一篇文章我们探索了HashMap,详细解说了哈希冲突,红黑树以及Map底层到底是怎么实现的,这一篇我们简单说一下HashSet,为什么要说简单说一下,因为HashSet的底层就是HashMap,只要你读懂了Map,Set说实话只需要简单看一下。
java高级——Collection集合之Map探索(包含红黑树,Map的底层实现原理及相关类如LinkedHashMap等多中介绍,满满的干货)
文章介绍
这一篇我们看的是单列集合中的Set,那么上一篇说了Set底层是Map,不能光说不练,还是得简单看一下为什么底层是Map,总归来说有一丢丢不一样
,如果没有看过Map底层的伙伴,一定要提前看一下Map好吧
,因为Set确实没有什么值得研究的代码,只是看一下大致结构。
继承结构
看起来继承结构挺复杂的吧,归到底除了克隆,序列化和一些必须的集合接口就没了,乍一看继承结构是和Map没有什么关系的,没什么关系,继续往下看。
底层代码(一张图你就悟了)
来吧兄弟们看一下,HashSet的构造方式是一个HashMap
,你还能说底层不是Map吗?构造方法基本是和Map一致的,这里我们说下底层存储稍有不一样的地方,先来说一下这几个常量的作用。
-
private transient HashMap<E,Object> map;(存储数据的map)
-
private static final Object PRESENT = new Object();(Map中value的值,固定为一个空对象且为final,不会占用内存)
不一样的地方可能就是添加元素的那里,首先我们要知道,Map的key本身就是不允许重复的
,所以这也就是Set不可重复的缘由
,而且Set是可以允许null的,因为Map中也可以存在Key为null的元素
,这样说就可以说得通了。
注意看上面这张图,每次添加元素的时候,调用的是Map的put方法
,而key就是我们要存储到Set的元素
,value则是上面说的空对象
,但实际都是一个内存地址,不会占用内存,这也是两者不同的地方吧。
关于LinkedHashSet和TreeSet也就不必多说了,看下图就行了,底层都是Map,LinkedListHashSet的源码更是简单,只是调用了HashSet的构造方法,仅此而已,啥都没有,所以说兄弟们,一定要学习好Map,不懂的看一下我之前发布的那篇博客
,三万字,颤抖吧
。
下期预告
关于java集合的这一大类算是结束了,下一篇冲击java的异常家族,期待下次见面。