自学内容网 自学内容网

java高级——Collection集合之Set探索(底层为HashMap实现)

前情提要

   上一篇文章我们探索了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的异常家族,期待下次见面。


原文地址:https://blog.csdn.net/weixin_48588897/article/details/140593822

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!