Java集合类之HashSet实例分析


这篇文章主要介绍“Java集合类之HashSet实例分析”,在日常操作中,相信很多人在Java集合类之HashSet实例分析问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java集免费云主机域名合类之HashSet实例分析”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!Set接口对象存放的数据是没有重复,且数据是无序存放的(添加顺序和存放顺序不一致,但是这个存放的顺序是固定的,不会随机变化)代码示例:HashSet的底层其实,是HashMap:维护的是一个数组 + 单向链表HashSet不保证存放元素的顺序和取出的顺序一致,这取决于hash后,再确定索引的结果代码示例:针对如下的代码对java的扩容机制进行分析:执行add操作:(传入待添加的值e和PRESENT,这里的PRESENT只起到一个占位的效果)继续步入:在进入putVal方法之前,我们先来看一下这个hash的算法:如果待添加的数据为null,则返回0值,否则返回hash算法的结果(此算法可以极大的防止冲突的发生)执行putVal方法:这个方法很重要(且复杂)!不要慌,我们来一步一步进行分析:先来看一下这个东西:这个是存放Map Node节点的数组,如果你精通数据结构邻接表,对这个数组应该很熟悉,tab里面的存储结构是这样的:(下图仅作示例)当这个节点数组为空或者大小为0的时候,会触发这个操作:(tab先进行resize操作,随后返回给n一个处理后数组的大小)那这个resize操作到底是什么呢?我们步入来看看它的真面目:由于初始化tab为null,经过一番操作,会执行如下的代码,这里给计算了新数组的空间大小:DEFAULT_INITIAL_CAPACITY的定义,默认表的大小为16:下面这里是JDK设计者的聪明所在,tab数组并非用到空之后扩容,而是内部有一个临界的值newThr,所用的空间达到临界的值会触发扩容机制 (容量*2),起到一个缓冲的效果,这样做主要是为了防止阻塞注意:这里的空间指的是全部节点的数量,而非tab元素的个数一切准备就绪,开始扩容(这里初始化扩容的tab容量为16):我们再回到putVal方法,看一下接下来会发生什么有趣的事情根据key得到hash,去计算该key应该存放到table表的那个索引位置,并把这个位置对象赋值给p,如果p为null的话,表示该索引位置还没有存放过任何的数据,就在tab[i]位置创建一个Node,创建完新Node之后,它在tab数组中的存储结构就变成了这样:继续向下走,修改次数 + 1,并且还要判断一次tab元素数量是否大于了临界值,如果大于了临界值,进行扩容操作:最后,返回null,代表一切操作成功!至此,初次添加数据的操作就已经完成了!初次添加数据的结构其实很简单,更加困难的是第二次添加数据的操作我们继续步入,再次追到putVal方法:和初次添加不同的是,不会再进入下面的语句,而是向下执行:直接判断计算得出的tab索引位置有没有数据,没有的话(实验的值没有)继续新建节点:添加完数据后,tab里面的结构就变成了这样:此时存在两个key是相等的,那么下面的语句必然不会为空,因为key相等,那么他们hash过后的值也会相等:继续步入,走到else里面,我们来看一下if语句里面的内容:如果当前索引位置对应的链表的第一个元素和准备添加的key的hash值一样并且满足准备:(比较地址和值)加入的key和p指向的Node节点的key是同一个对象不是同一个对象,但是通过equals比较过后相同这时就不能加入,执行:e = p;再来看看else if语句:判断p是不是一颗红黑树,如果是的话就按照红黑树的方式进行比较:再看看else语句:当前索引位置已经是一个链表。会依次和该链表的每一个节点进行比较,有重复的直接break掉,没有重复的进行挂载注意:在添加新节点之后,需要进行一次链表长度判断,看下当前链表中是否已经有8个节点了,如果已经存在了8个节点,会通过treeifyBin方法尝试进化链表为红黑树有趣的是,在进化红黑树的代码中,存在下面这两行:这里面的MIN_TREEIFY_CAPACITY定义如下:也就是说,如果tab长度小于64,不会马上进行树化,会先进行tab扩容操作!到此,关于“Java集合类之HashSet实例分析”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注百云主机网站,小编会继续努力为大家带来更多实用的文章!

相关推荐: WPF怎么使用Dragablz构建可拖拽分离的Tab页程序

今天小编给大家分享一下WPF怎么使用Dragablz构建可拖拽分离的Tab页程序的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。今天发现了一个可以…

免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。

(0)
打赏 微信扫一扫 微信扫一扫
上一篇 03/25 10:15
下一篇 03/25 10:16

相关推荐