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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© majunm 中级黑马   /  2013-7-24 15:06  /  1515 人查看  /  13 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

import java.util.HashSet;
import java.util.LinkedHashSet;
import java.util.Random;
public class Radom {
//0-9随机数 不重复
  public static void main(String[] args) {
  
       Random r = new Random();  
       HashSet hs=new HashSet();;
       while(true){
      int x=r.nextInt(10);
      hs.add(x);
     if(hs.size()==10){
            break;
      }
   }
   System.out.println(hs);
}
}
打印结果是 0 1 2 3 4 5 6 7 8 9 要是Treeset 结果是这样我理解 hashSet也这样 怎么回事??

13 个回复

正序浏览
郭宝伦 发表于 2013-7-24 15:59
HashSet 其实也是有序的(老毕说它是无序,这种说法不恰当,应该是无索引的才对,因为不能通过角标来操作元 ...

就你说的靠谱 至今为止
回复 使用道具 举报
Jomes 发表于 2013-7-24 16:17
打印出来的结果是 [ 9,  8,  1,  0,  3,  2,  5,  4,  7,  6]

你确定 结果 会变???   如果没错的话 你的结果不论运行多少遍都是这样9 8 1 0 3 2 5 4 7 6...
回复 使用道具 举报
Jomes 中级黑马 2013-7-24 16:17:33
11#
  1. package lu.Connection;

  2. import java.util.HashSet;
  3. import java.util.Iterator;
  4. import java.util.Random;

  5. public class TestSets {

  6.         /**
  7.          * @param args
  8.          */
  9.         public static void main(String[] args) {
  10.                 // TODO Auto-generated method stub

  11.                  Random r=new Random();
  12.                  HashSet hs=new HashSet();
  13.                
  14.                  
  15.                  while(true){
  16.                          
  17.                          int x=r.nextInt(10);
  18.                          System.out.println(x);
  19.                          hs.add(" "+x);
  20.                        
  21.                          
  22.                          
  23.                        
  24.                          if(hs.size()==10){
  25.                        
  26.                                          System.out.println(hs);
  27.                        
  28.                                  break;
  29.                          }
  30.                          
  31.                  }
  32.                  
  33.         }

  34. }
复制代码
打印出来的结果是 [ 9,  8,  1,  0,  3,  2,  5,  4,  7,  6]
回复 使用道具 举报
HashSet通过散列码来存储元素,而得到有序结果的原因是通过散列函数转换得到的存储地址也是有序的。举个例子,假如散列函数是int值+1,那么0对应的散列码是1,1对应的是2,以此类推,9对应的是10,按这样的顺序存储到内存中,我们在取出时也是按地址取的,那么得到的也就是有序的了。当然,实际的函数比这个要复杂的多,我只是打个比方,让楼主明白它的原理。
回复 使用道具 举报
通过元素的hashcode来确定存储的位置,刚好整型的hashcode值也是他自身,所以最后存储成有序的了。纯属巧合
回复 使用道具 举报
majunm 中级黑马 2013-7-24 15:54:48
8#
yinjiek 发表于 2013-7-24 15:22
HashSet
add(E e)
          如果此 set 中尚未包含指定元素,则添加指定元素。

哥哥 你看问题所在了吗 打印结果是有序的 treeset 结果是0 12 3 45 6789 我没意见 问题是 hashset 结果也是0 1 2 3 4 5 6 7 8 9 运行很多遍都是这个结果 你可以复制代码运行一下 看看 难道我的电脑问题..
回复 使用道具 举报
majunm 中级黑马 2013-7-24 15:51:39
7#
liuzhming 发表于 2013-7-24 15:47
我们需要通过了解它的存储机制来解释它。HashSet创建的类集使用散列表进行存储,散列表通过使用散列法来存 ...

我运行好多遍 都是 0 1 2 3 4 5 6 7 8 9    我用的是hashset  不是treeset
回复 使用道具 举报
liuzhming 来自手机 中级黑马 2013-7-24 15:47:58
地板
我们需要通过了解它的存储机制来解释它。HashSet创建的类集使用散列表进行存储,散列表通过使用散列法来存储信息。它的算法基本思想是:以结点的关键字为自变量,通过一定的函数关系计算出对应的函数值,以这个值作为该结点存储在散列表中的地址。散列集合并没有确保其元素的顺序,因为散列法的处理通常不用于创建有序集合。如果需要排序存储,还是要使用TreeSet集合。所以这并不是经过排序得到的,而是int值通过某种函数得到的存放地址有序而形成的。
回复 使用道具 举报
HashSet
add(E e)
          如果此 set 中尚未包含指定元素,则添加指定元素。
此类实现 Set 接口,由哈希表(实际上是一个 HashMap 实例)支持。它不保证 set 的迭代顺序;特别是它不保证该顺序恒久不变。此类允许使用 null 元素。
回复 使用道具 举报
HashSet
add(E e)
          如果此 set 中尚未包含指定元素,则添加指定元素。
此类实现 Set 接口,由哈希表(实际上是一个 HashMap 实例)支持。它不保证 set 的迭代顺序;特别是它不保证该顺序恒久不变。此类允许使用 null 元素。
回复 使用道具 举报
赶快回答啊 老大们
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马