Hashset,Iterator

HashSet类主要是设计用来做高性能集运算的,例如对两个集合求交集、并集、差集等。集合中包含一组不重复出现且无特性顺序的元素。

(一)HashSet的一些特性如下:

1、HashSet中的值不能重复没有顺序

2、HashSet的容量会按需自动添加。

 

(二)那么HshSet是如何做到集合中的值不重复呢?

当使用HashSet时,hashcode()方法就会得到调用,它会先判断已经存储在集合中的对象的hash code值是否与新增加的对象的hash code的值一致,如果不一致,就直接加入到集合中;如果一致,那么再进行equals方法的比较,如果equals方法返回true,说明对象已经存在,所以不加进去了,否则加进去。

 

(三)HashSet里面并没有get()方法,那么我们就要用迭代器Iterator

 

迭代器(Iterator)模式,又叫做游标(Cursor)模式:

提供一种方法访问一个容器(container)对象中各个元素,而又不需暴露该对象的内部细节。 从定义可见,迭代器模式是为容器而生。很明显,这里的容器对象是HashSet。

主要用到的方法主要有两个:

a)hasNext()方法:判断容器是否有下一个元素,是的话返回true,不存在的话返回false。

b)next()方法:取出下一个元素。

 

那么,如何用迭代器来输出HashSet的内容呢,看下面代码:

上述代码生成了一个 Iterator 对象, while结构利用hasNext()方法遍历HashSet的元素,再利用next()方法访问。

 

(五)HashSet底层是使用HashMap实现的,当使用add方法将对象添加到Set当中时,实际上是将该对象作为底层所维护的Map对象的key,而value则都是同一个Object对象,这个Object对象实际上我们是用不上的。而Map对象的底层是一个一个Entry对象组成。

 

(六)当向HashMap中put一对键值时,它会根据key的hashCode值计算出一个位置,该位置即使此对象准备往数组中存放的位置。

如果计算出的位置没有对象存在,就把此对象放在那个位置,如果该位置已经存在对象,则顺着该位置的对象的链开始寻找(Entry类有一个Entry类型的next成员变量,指向该对象的下一个对象),不断地调用equals方法跟链上的对象进行比较,如果链上的对象与这个要插入的对象的equals方法都返回false,则把这个对象插入到该位置的最前面,并且指向原来链上的第一个Entry对象。

如图:

 

 

转载于:https://www.cnblogs.com/vmax-tam/p/4074640.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值