HashSet 的一点理解

HashSet底层用的是  哈希表的数据结构  也就是散列表  通过查看HashSet的源码 发现他是用HasMap,所以HashSet内部实现还是HashMap,

hashSet存入数据要经过三个步骤     1:hashCode() ;  2:== ;  3:equals();

当1相等   2不等 才去执行3  

为什么要这么多步骤呢  因为hashCode()的值相同也不能说明这两对象是相同的;

觉得很经典的一个例子   男:1   女:0   

5岁男孩    5 + 1 =6;

6岁女孩    6 + 0  =6;

一样但不同  所以还需要后面的步骤;


hashSet的remove()方法也是遵循上面的三个步骤;1相就说么相同 就会删除 等等.....


hashSet存入相同的数据,会先入为主 也就是后面相同的不会覆盖原有的会舍弃新来的;

hashMap存入数据时,主键是先入为主,就是舍弃新来的 但是值会被新来的覆盖;


HashSet <String> set=new HashSet<>(16,075F);   

里面的16  是默认分组组数   0.75是负载因子(加载因子)

这里的表示现在set能够存入的数据是16*0.75=12个 当元素超过12个(假设13个)  就会自动扩容变为(16*2,0.75F)在元素不能容纳这么多是会一直扩容下去......

如果 负载因为是1.0F    可以容纳16个   13<16   所以不会扩容 

分组组数都是  must be a power of two 必须是2的幂

这时候 如果有0.75的负载和1.0的负载因子 具体内部情况如下

13  0.75F  占用32个内存空间    平均每组里面   13/32个元素  0.40625      A

13  1.0F    占用16个内存空间    平均每组里面13/16个元素0.8125        B

明显的0.75的负载因子的每组里面的元素要少  当数据量很大时  如果查找数据效率就会特别明显

此时 查找速率  A>B   占用内存  A>B 

但是负载因子减小   那样内存占用就会增加   所以有得必有失;

具体情况怎么去设定还要看实际情况......




 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值