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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 冯超 高级黑马   /  2013-4-14 16:10  /  3559 人查看  /  9 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 冯超 于 2013-4-15 09:56 编辑

:L:L
  1. package threeCollection;

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

  4. public class SetTest {

  5.         /**
  6.          * @param args
  7.          */
  8.         //set集合石一种不包含重复元素的Collection
  9.         public static void main(String[] args) {
  10.                 // TODO Auto-generated method stub
  11.                 hashSetTest();
  12.         }
  13.         //HashSet:和存放顺序无关,反正结果是无序的;最多只能放入一个null值;不能有重复元素
  14.         public static void hashSetTest() {
  15.                 HashSet hs = new HashSet();
  16.                
  17.                 for(int i = 0; i < 10; i++) {
  18.                         hs.add(new Integer(i));
  19.                 }
  20.                 hs.add("xx");
  21.                 hs.add(12f);
  22.                 hs.add("xa");
  23.                 hs.add("xx");
  24.                 //用迭代器输出
  25.                 Iterator  it = hs.iterator();
  26.                 while(it.hasNext()) {
  27.                         Object obj = it.next();
  28.                         System.out.print(obj + " ");
  29.                 }
  30.         }

  31. }
复制代码
下午复习Collcetion集合的时候,查资料发现这句话没理解。
打印结果是有序的····:L

评分

参与人数 1技术分 +1 收起 理由
张熙韬 + 1

查看全部评分

9 个回复

倒序浏览
追加一问:treeSet如何提取有序的序列···········?
回复 使用道具 举报
意思就是只要你不复写它的hashCode和equals方法,他就是无序的,你要想要让它有序,就必须重写这两个方法
回复 使用道具 举报
赵晓东 发表于 2013-4-14 16:23
意思就是只要你不复写它的hashCode和equals方法,他就是无序的,你要想要让它有序,就必须重写这两个方法 ...

那我可以吧写个方法也可以把数组搞成有序的,把所有集合都搞成有序的···有意义么?
回复 使用道具 举报
HashSet的无序的意思是:存入和取出的顺序不一定一致。你上面的代码往HashSet里面存的顺序是0,1,2,3,4,5,6,7,8,9,xx,12.0,xa      
但是取出的顺序是0 1 2 3 4 12.0 5 6 7 8 9 xa xx    这就是无序
回复 使用道具 举报
下面是我根据一些资料和自己的理解整理的,希望对你有帮助
哈希表简介:
1)哈希表是按照哈希值的大小进行排列的,如果两个哈希值不同,则大的值放后面;如果两个哈希值相同,则再用equals方法比较两个元素的对象是否相同,如果不同,则将第二个值顺延,两个值串起来,放在同一个位置上。
2)取值时是按照哈希值取出来的。
3)哈希值的取值方式:哈希值存入哈希表中,哈希表也称散列表。散列表是存放记录的数组。具体来说,散列表是根据散列函数H(Key)和处理冲突的方法将一组关键字映象到一个有限的连续的地址集(区间)上,并以关键字在地址集中的“象”,作为这条记录在表中的存储位置,这种表表称为散列表,这一映象过程就称为散列造表或散列,所存储位置称为散列地址(这是百度百科上的内容)。我的理解是:存入的对象的地址是通过提取其信息摘要,通过散列函数计算而获得的一个关键码(Key)即哈希值,然后将这个值存入哈希表,而哈希表的存值方式是按照哈希值的大小顺序存储的,并且在这个哈希表中有自己的索引,但是哈希表的取值方式并不是按照索引的方式取出的。取出方式是按照哈希表中特有的算法取出的哈希值(注意,现在说的是哈希值,不是元素的取出),这些算法有直接寻址法、折叠法、平方取中法以及其他的一些方法等等。具体是按哪种算法查找的,我并不太清楚,所以,取出的哈希值可能就不是按照哈希值的大小顺序取出的了。

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
Alan 中级黑马 2013-4-15 01:08:37
7#
此类实现 Set 接口,由哈希表(实际上是一个 HashMap 实例)支持。它不保证 set 的迭代顺序;特别是它不保证该顺序恒久不变。此类允许使用 null 元素。 楼主多试几次就能看到结果

回复 使用道具 举报
hashset:底层数据结构是哈希表。hashset的无序指的是存入和取出的顺序不一致,导致这的原因是hashset集合的取出时根据存入时的哈希值取出的。
不能存储相同元素因为哈希表具有唯一性:是通过元素的两个方法hashcode和equals来完成
如果hashcode值相同,才会判断equals是否为true
如果元素的hashset值不同,不会调用equals,所以每个元素的哈希值都是不同的
注意:对于判断元素是否存在以及删除添加等操作依赖的是元素的hashcode和equals方法
回复 使用道具 举报
如果真想弄明白最最底层的原理,看看数据结构的“查找”“哈希表”,你就会清清楚楚。
回复 使用道具 举报
所谓无序,就是没有顺序。比如说,不输入的是:zhangsan,lisi,wangwu,zhaoer.
所谓重复,就是不能出现相同的元素。
那么他输出的就是乱的,每次运行的结果都是不一样的。
那么有序呢。就是按照你指定的顺序排列,一般是按照字母顺序表。
当然,你的不一定是字母,也可以是数字。或者其他能代表顺序的东西。这是,你要做的就是排序。
排序,从写hashcode.  
重复,重写eques.
有些地方记不清,错了请指出。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马