黑马程序员技术交流社区
标题:
问一个关于随机数与Set的问题
[打印本页]
作者:
y506798278
时间:
2016-7-8 15:49
标题:
问一个关于随机数与Set的问题
//这个程序就是弄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不难理解,可是为什么它会排序呢
作者:
cat73
时间:
2016-7-8 15:59
本帖最后由 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
作者:
java627
时间:
2016-7-8 16:49
用set就是简单
作者:
longforus
时间:
2016-7-8 17:59
我觉得hashSet的底层保存位置就是安装hash码来决定位置的,int值是递增的hash码也是递增的所以就出现这样的顺序排列
作者:
yabiaodou
时间:
2016-7-8 19:51
持续长姿势中...............
作者:
y506798278
时间:
2016-7-8 21:12
cat73 发表于 2016-7-8 15:59
这个就要看 HashSet 的底层实现原理了。
首先大体说下,这里面是按照 hash 排序的,数字的 hash 就是它本身 ...
被你看出是1.8的了
作者:
ddyyuu82dd
时间:
2016-7-9 22:42
涨姿势666666666
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2