鱼C论坛

 找回密码
 立即注册
查看: 6533|回复: 106

[学习笔记] HashSet的存储分析

[复制链接]
回帖奖励 22 鱼币 回复本帖可获得 1 鱼币奖励! 每人限 3 次(中奖概率 30%)
发表于 2019-2-22 17:23:30 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
一、问题的发现:(以下代码可直接复制测试)
                在做斗地主洗牌的时候我们发现在一个新的HasSet中添加1-52,打印HasSet时输出也是1-52
                Set hashSet = new HashSet();
                      for (int i = 1; i <= 52; i++) {
                            hashSet.add(i);
                }
                System.out.println(hashSet);//[1, 2, 3, ..., 50, 51, 52]
二、问题的提出:
        问题1.不是说HashSet是无序吗?
                解:HashSet的无序是体现在''存放''的顺序和''取出''的顺序可能会不一样;
                        Set hashSet = new HashSet();
                              hashSet .add(3);
                        hashSet .add(2);
                        hashSet .add(17);
                        System.out.println(hashSet);//[17,2, 3]
                        看这就无序了,那为什么会这样呢
        问题2.HashSet到底是如何存放数据的?
                第一步:我们得先看一下HashSet的数据结构是什么样子的;
                                在jdk1.8之前:HashSet结构=数组结构+链表结构;
                                在jdk1.8之后包括1.8:HashSet结构=数组结构+链表结构;
                                                                HashSet结构=数组结构+红黑树结构(当链表长度>=8);
                第二步:
                        每次数据存放的位置是:()数据的hasCode()值) 取余(数组长度 )=余数,该余数就是放在数组对应的索引上面
                                2.1:那万一余数相同怎么办?
                                                如果没有重写equals()方法:则比较地址值,地址值相同则不存;否则以链表的形式存取
                                                如果重写了equals()方法:则比较内容值,内容值相同则不存;否则以链表的形式存取
                                2.2:那初始的数组长度是多少?
                                                新建的HashSet初始数组长度是2*4=16;
                                                每当hasSet.length>数组长度*0.75时,为保证能存下所有数据数组的长度会翻一倍2*5=32,HashSet的数据结构会重建,之后再刚刚提到的方式进行数据重新排序;
                                3.3:那hashCode()值如何计算?
                                                调用hashCode()方法打印就可以看到;
                                                String类源码较为复杂(我也没看懂)总结为:
                                                        public static int getStringHasCode(String str){
                                                                char[] chars = str.toCharArray();//{0,0}
                                                                int hasCode = 0;
                                                                for (int i = 0; i < chars.length; i++) {
                                                                            hasCode = 31*hasCode + chars;//48,48*31+48
                                                                        }
                                                                return hasCode;
                                                                    }

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2019-2-22 17:26:14 | 显示全部楼层
本帖最后由 cx1521126332 于 2019-2-22 17:32 编辑

HashSet存取数据流程.png

hasCode和equals.png

hasCode和equals.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-2-22 17:27:06 | 显示全部楼层
本帖最后由 cx1521126332 于 2019-2-22 17:32 编辑

HasSet的数据结构.png

HasSet的数据结构.png

HasSet的数据结构.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-2-24 17:16:51 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-7-28 10:10:02 | 显示全部楼层
鱼币
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-7-28 10:10:43 | 显示全部楼层
鱼币
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-10-30 16:54:50 | 显示全部楼层
鱼币
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-10-30 16:55:33 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-8-25 09:58:53 | 显示全部楼层

回帖奖励 +1 鱼币

学习
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-8-25 10:03:00 | 显示全部楼层
学习
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-8-26 08:20:11 | 显示全部楼层

回帖奖励 +1 鱼币

学习学习
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-8-26 11:19:35 | 显示全部楼层

回帖奖励 +1 鱼币

学习
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-12-30 17:01:41 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-12-30 17:02:23 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-12-30 17:02:56 | 显示全部楼层

回帖奖励 +1 鱼币

没有
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-12-30 17:04:04 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-12-30 17:07:29 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-12-30 17:08:44 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-12-30 18:43:20 | 显示全部楼层
没有了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-12-30 18:44:03 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-25 07:56

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表