本篇内容主要讲解“JavaHashSet怎么添加遍历元素”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“JavaHashSet怎么添加遍历元素”吧!1.HashSet
实现了Set
接口2.HashSet
底层实际上是由HashMap
实现的3.可以存放null
,但是只能有一个null
4.HashSet
不保证元素是有序的(即不保证存放元素的顺序和取出元素的顺序一致),取决于hash
后,再确定索引的结果5.不能有重复的元素HashSet
底层是HashMap
,HashMap
底层是数组 + 链表 + 红黑树1.HashSet
底层是HashMap
2.当添加一个元素时,会先得到待添加元素的hash
值,然后将其转换成一个索引值3.查询存储数据表(Node 数组)table
,看当前待添加元素所对应的索引值的位置是否已经存放了其它元素4.如果当前索引值所对应的的位置不存在其它元素,就将当前待添加元素放到这个索引值所对应的的位置5.如果当前索引值所对应的位置存在其它元素,就调用待添加元素.equals(已存在元素)
比较,结果为true
,则放弃添加;结果为false
,则将待添加元素放到已存在元素的后面(已存在元素.next = 待添加元素
)1.HashSet
的底层是HashMap
,第一次添加元素时,table
数组扩容到cap = 16
,threshold
(临界值) = cap * loadFactor(加载因子 0.75) = 122.如果table
数组使用到了临界值 12,就会扩容到cap * 2 = 32
,新的临界值就是32 * 0.75 = 24
,以此类推3.在 Java8 中,如果一条链表上的元素个数到达TREEIFY_THRESHOLD
(默认是 8),并且table
的大小 >=MIN_TREEIFY_CAPACITY
(默认是 64),就会进行树化(红黑树)4.判断是否扩容是根据++size > threshold
,即是否扩容,是根据HashMap
所存的元素个数(size
)是否超过临界值,而不是根据table.length()
是否超过临界值1.HashSet
的底层是HashMap
,HashSet
的迭代器也是借由HashMap
来实现的2.HashSet.iterator()
实际上是去调用HashMap
的KeySet().iterator()
3.KeySet()
方法返回一个KeySet
对象,而KeySet
是HashMap
的一个内部类4.KeySet().iterator()
方法返回一个KeyIterator
对象,KeyIterator
是HashMap
的一个内部类5.KeyIterator
继承了HashIterator
(HashMap
的内部类) 类,并实现了Iterator
接口,即KeyIterator
、HashItera免费云主机域名tor
才是真正实现迭代器的类6.当执行完Iterator iterator = HashSet.iterator;
之后,此时的iterator
对象中已经存储了一个元素节点怎么做到的?回到第 4 步,KeySet().iterator()
方法返回一个KeyIterator
对象new KeyIterator()
调用KeyIterator
的无参构造器在这之前,会先调用其父类HashIterator
的无参构造器因此,分析HashIterator
的无参构造器就知道发生了什么next
、current
、index
都是HashIterator
的属性Node
先把Node
数组talbe
赋给t
current = next = null;
current
、next
都置为null
index = 0;
index
置为0
do {} while (index 这个
一旦do-while
会在table
中遍历Node
结点(next = t[index++]) == null
不成立时,就说明找到了一个table
中的Node
结点将这个节点赋给next
,并退出当前do-while
循环此时Iterator iterator = HashSet.iterator;
就执行完了当前iterator
的运行类型其实是HashIterator
,而HashIterator
的next
中存储着从table
中遍历出来的一个Node
结点7.执行iterator.hasNext
此时的next
存储着一个Node
,所以并不为null
,返回true
8.执行iterator.next()
I.Node
把当前存储着Node
结点的next
赋值给了e
II.(next = (current = e).next) == null
判断当前结点的下一个结点是否为null
(a). 如果当前结点的下一个结点为null
,就执行do {} while (index ,在
(b). 如果当前结点的下一个结点不为table
数组中遍历,寻找table
数组中的下一个Node
并赋值给next
null
,就将当前结点的下一个结点赋值给next
,并且此刻不会去table
数组中遍历下一个Node
结点III.将找到的结点e
返回IV.之后每次执行iterator.next()
都像(a)、(b)那样去判断遍历,直到遍历完成到此,相信大家对“JavaHashSet怎么添加遍历元素”有了更深的了解,不妨来实际操作一番吧!这里是百云主机网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!
本篇内容介绍了“Vue组件Toas免费云主机域名t显示框怎么用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!效果展示代码分析div包含icon小图标和文字说明,…
免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。