HashSet解释,你要是看不懂我离开Android行业

你仔细看,我会非常认真的,我主要解释HashSet如何存储获取元素
HashSet实现了Set接口(Collecion接口下面三大接口之一)。

Set接口有个特点:元素必须唯一,也就是说不能存储两个一样的元素。HashSet也遗传了这一点。
Set的实现类都有自己判断元素是否唯一的方法,HashSet是通过元素的hashCode()和equals()判断元素是否相同的。

代码很简单,为了更加简单,泛型我也不加了

Set set=new HashSet();
set.add("java");
复制代码

首先跟你们说个事情,HashSet底层用HashMap实现的,最终还是用到了数组,。看不懂没关系,知道底层用数组实现就好了。
弄了一个HashSet对象,并且存储了一个"java"字符串。现在看看HashSet如何把这个"Java"存进去的。
假设有个长度为8的数组。

首先,先调用"java"字符串的hashCode()方法计算hashCode值。假如,得出的结构是5,"java"就存储在数组5的位置。

好的,存储的一些列复杂操作被我一句话解释了。

接下来好戏来了

现在我要存储一个"php"字符串。

Set set=new HashSet();
set.add("java");
set.add("php");
复制代码

同理,调用"php"的hashCode()方法。如果,计算出来的结果还是5。那么就把"php"存储到5的位置。"php"去5的位置一看,我位置咋有人呢?说好的 世界上最好的语言呢?

当然你总不可能不让"php"存了呗。为了解决这种情况,采用了链表(Node)这种数据结构。就是,你这个Node除了存储自己的数据,还要存储下一个数据的地址(也称为指向)。只是存储地址而已。那么好办...

数组5这个位置存储了一个Node,这个Node既保存了"php"字符串对象,又保存了另外一个存储"java"字符串对象的Node的地址,记住,只是保存地址啊。这样大家就相当于都存储在数组5这个位置了。现在有两个Node,一个是存储了"php"的Node,一个是存储了"java"的Node。并且存储"php"的Node还保存了存储了"java"Node的地址。是方便找到"java"的Node

这个时候可能有人问了,凭什么先保存"php"再保存"java"?这肯定不是因为"php是世界上最好的语言"的关系啊,这招叫做头插法。这是因为HashMap(HashSet用到了HashMap)设计者认为啊,新保存的数据更加可能被用到,仅此而已。

假如我要查找"java"呢?

这还不简单,先计算"java"的hashCode值啊,一计算,值等于5。就去数组5的位置查呗。一看,嗯?"php"?不是我要找的,就去看看保存"php"的Node有没有指向另外一个Node,一看,果然指向了另外一个Node,一看另外一个Node,保存的就是"java",那么我就找到了。查找"php"更加简单,计算"php"的hashCode值就得到了。

这就是为什么HashSet跟HashMap效率高(增删快,查找也快)的某个原因,等下具体分析怎么就效率高了。通过直接计算元素的hashCode值,就确定位置了。然后直接操作就好了。

但是大家发现没有,如果存储很多元素都在一个位置,这样查找起来就会变得麻烦。假如10个元素全部存储在5的位置,结构类似于这样Node1-->Node2-->Node3-->...-->Node10。如果我要查找Node10中存储的元素就会变得很麻烦,效率低下。就违背了Hash系的初衷。为了避免这样的情况出现,就让数组的每个位置存储的概率一样大。如果让每个位置存储的概率一样大呢?还有问题,就算你每个位置都存储了元素,我再继续存储元素,总会出现一个位置存储多个元素的现象,这该如何解决?

如何尽量让每个位置被存储的概率一样大?

有空更新

元素大于容量怎么办?

有空更新

怎么保证元素唯一性的?

有空更新

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值