黑马程序员技术交流社区

标题: set集合求科普 [打印本页]

作者: majunm    时间: 2013-7-24 15:06
标题: set集合求科普
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也这样 怎么回事??

作者: majunm    时间: 2013-7-24 15:10
赶快回答啊 老大们
作者: yinjiek    时间: 2013-7-24 15:21
HashSet
add(E e)
          如果此 set 中尚未包含指定元素,则添加指定元素。
此类实现 Set 接口,由哈希表(实际上是一个 HashMap 实例)支持。它不保证 set 的迭代顺序;特别是它不保证该顺序恒久不变。此类允许使用 null 元素。
作者: yinjiek    时间: 2013-7-24 15:22
HashSet
add(E e)
          如果此 set 中尚未包含指定元素,则添加指定元素。
此类实现 Set 接口,由哈希表(实际上是一个 HashMap 实例)支持。它不保证 set 的迭代顺序;特别是它不保证该顺序恒久不变。此类允许使用 null 元素。
作者: liuzhming    时间: 2013-7-24 15:47
我们需要通过了解它的存储机制来解释它。HashSet创建的类集使用散列表进行存储,散列表通过使用散列法来存储信息。它的算法基本思想是:以结点的关键字为自变量,通过一定的函数关系计算出对应的函数值,以这个值作为该结点存储在散列表中的地址。散列集合并没有确保其元素的顺序,因为散列法的处理通常不用于创建有序集合。如果需要排序存储,还是要使用TreeSet集合。所以这并不是经过排序得到的,而是int值通过某种函数得到的存放地址有序而形成的。

作者: majunm    时间: 2013-7-24 15:51
liuzhming 发表于 2013-7-24 15:47
我们需要通过了解它的存储机制来解释它。HashSet创建的类集使用散列表进行存储,散列表通过使用散列法来存 ...

我运行好多遍 都是 0 1 2 3 4 5 6 7 8 9    我用的是hashset  不是treeset
作者: majunm    时间: 2013-7-24 15:54
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 运行很多遍都是这个结果 你可以复制代码运行一下 看看 难道我的电脑问题..
作者: 薛淑凯    时间: 2013-7-24 16:02
通过元素的hashcode来确定存储的位置,刚好整型的hashcode值也是他自身,所以最后存储成有序的了。纯属巧合
作者: liuzhming    时间: 2013-7-24 16:17
HashSet通过散列码来存储元素,而得到有序结果的原因是通过散列函数转换得到的存储地址也是有序的。举个例子,假如散列函数是int值+1,那么0对应的散列码是1,1对应的是2,以此类推,9对应的是10,按这样的顺序存储到内存中,我们在取出时也是按地址取的,那么得到的也就是有序的了。当然,实际的函数比这个要复杂的多,我只是打个比方,让楼主明白它的原理。

作者: Jomes    时间: 2013-7-24 16:17
  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]
作者: majunm    时间: 2013-7-24 16:42
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...
作者: majunm    时间: 2013-7-24 16:47
郭宝伦 发表于 2013-7-24 15:59
HashSet 其实也是有序的(老毕说它是无序,这种说法不恰当,应该是无索引的才对,因为不能通过角标来操作元 ...

就你说的靠谱 至今为止




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2