A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 观决 中级黑马   /  2014-6-4 08:20  /  1206 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

来论坛很久了   一般也就回答下问题  最近想把自己在学习中的一些笔记 还有觉得好的知识点 分享下 :lol

HashSet底层用的是  哈希表的数据结构  也就是散列表  通过查看HashSet的源码 发现他是用HasMap,所以HashSet内部实现还是HashMap(value=null),
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
但是负载因子减小   那样内存占用就会增加   所以有得必有失;
具体情况怎么去设定还要看实际情况......









2 个回复

倒序浏览
楼主 给力啊
回复 使用道具 举报

{:2_36:}{:3_46:}
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马