来论坛很久了 一般也就回答下问题 最近想把自己在学习中的一些笔记 还有觉得好的知识点 分享下 :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
但是负载因子减小 那样内存占用就会增加 所以有得必有失;
具体情况怎么去设定还要看实际情况......
|
|