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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

//这个程序就是弄20个随机数出来存进Set中
public static void main(String[] args) {
                Random random = new Random();
                HashSet<Integer> set = new HashSet<>();
                while(set.size() < 20) {
                        int i = random.nextInt(20)+1;
                        set.add(i);
                }
                System.out.println(set);
        }
//[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20]
//这是输出的结果,刚好是1到20不难理解,可是为什么它会排序呢

7 个回复

倒序浏览
本帖最后由 cat73 于 2016-7-8 16:25 编辑

这个就要看 HashSet 的底层实现原理了。
首先大体说下,这里面是按照 hash 排序的,数字的 hash 就是它本身。

通过查看 HashSet 的源代码我们可以看到,它其实是通过包装 HashMap 来实现的:
http://hg.openjdk.java.net/jdk8/jdk8/jdk/file/687fd7c7986d/src/share/classes/java/util/HashSet.java#l95
因此这里的排序实际上是 HashMap 对 key 的排序方式。

这个我就不讲了吧- -
挺复杂的(其实是我懒而且这代码没啥注释。。)- -
而且 JDK7 跟 JDK8 的排序方式还不同。
看你的结果你应该用的是 JDK8 吧- -

HashMap 的底层是链表结构的(JDK8),具体代码可以看这里:
http://hg.openjdk.java.net/jdk8/jdk8/jdk/file/687fd7c7986d/src/share/classes/java/util/HashMap.java#l610

回复 使用道具 举报 1 0
用set就是简单
回复 使用道具 举报
我觉得hashSet的底层保存位置就是安装hash码来决定位置的,int值是递增的hash码也是递增的所以就出现这样的顺序排列
回复 使用道具 举报
持续长姿势中...............
回复 使用道具 举报
cat73 发表于 2016-7-8 15:59
这个就要看 HashSet 的底层实现原理了。
首先大体说下,这里面是按照 hash 排序的,数字的 hash 就是它本身 ...

被你看出是1.8的了

点评

因为柳柳桑内个电话号码公布的,在我这里执行结果怎么都不对。。所以就去看了看 HashMap 在 JDK6、7、8 的代码差异。。。  发表于 2016-7-8 21:24
回复 使用道具 举报
涨姿势666666666
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马