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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 盖保宁 黑马帝   /  2011-9-27 11:44  /  4182 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

老师讲过HashSet存入和取出的顺序不一定一致,元素不可以重复

可是顺序不一致,但也不是随机的顺序呀,我试了许多遍[code=java]                HashSet hs = new HashSet();
                hs.add("java01");
                hs.add("java02");
                hs.add("java03");
                hs.add("java04");
               
                Iterator it = hs.iterator();
                while(it.hasNext())
                {
                        System.out.print("迭代器");
                        System.out.println(it.next());
                }[/code]结果一直是
迭代器java04
迭代器java02
迭代器java03
迭代器java01
有谁能从原理上解释一下

评分

参与人数 1技术分 +1 收起 理由
wangfayin + 1

查看全部评分

6 个回复

正序浏览
黑马网友  发表于 2011-9-29 18:04:53
7#

hashset的特性解析。

简单的说一下hashset的底层数据结构,您就可以明白,为什么老师会那样说了!
           原理:hashset的底层数据结构是hash表,当我们将某个值传入hash表中的时候他会先调用这个对象的hashcode方法,计算出hashcode的值,然后将这个值存入到对应的hash表中,当我们在将一个值传入的时候,它还是会算出hashcode的方法,如果这个hash值的值与上一个的值不同,那么就会对号入座,将值存入hash表中,如果相同,那么这个对象就会调用equals方法与上一个对象比较,如果返回true则不存入,如果返回false就存入。
          应用:我们在实际开发中会用到hashset而这时一般都要重写传入hashset方法中对象的hashcode方法,和equals方法!在写方法的时候我们一定要遵循“属性值相同则尽量让hashcode相同,如果属性不同那么一定要让hashcode不同!”
         【拓展:】在重写hashcode方法时遵循的原则:“属性值相同则尽量让hashcode相同,如果属性不同那么一定要让hashcode不同”

评分

参与人数 1技术分 +1 收起 理由
wangfayin + 1 鼓励咯!

查看全部评分

回复 使用道具 举报
黑马网友  发表于 2011-9-28 18:51:13
地板
对于楼主在控制台输出的顺序,我觉得是不同的  在我的电脑上就不是那样的顺序输出的
    因为Hashset集合是一个无序的集合,在集合中只有List集合是天生有顺序的.
       很多人说HashSet是没有索引的,其实当向HashSet集合添加元素时,HashSet会根据该元素的hashCode值来决定它的存储位置——也就是说每个元素的hashCode值就是该元素的索引。
如果要使得Set集合有顺序可以使用HashSet的子类LinkedHashSet,他的是内需默认就是插入的顺序,
     另外当时使用Hashset集合时,往集合添加的元素要覆写hashCode和equals方法,因为Set集合是不允许重复的

评分

参与人数 1技术分 +1 收起 理由
wangfayin + 1

查看全部评分

回复 使用道具 举报
黑马网友  发表于 2011-9-27 19:40:43
报纸

HashSet

你就把hashSet的实现的数据结构看做是堆栈和队列的相结合
而且事先你是不知道那个先进先出的情况   当取出来的结果  你就没那么难理解了   因为你都不知道那个先进    所以取出来的结果是多样的也有可能  如果你理解不了  多少是受List集合的影响!
有点像买六合彩  不是有很多号码吗?

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

回复 使用道具 举报
黑马网友  发表于 2011-9-27 12:30:55
板凳
貌似曾经好像有人这样说:
存入散列本来就是为了节约空间,假如有10个散列桶,可能计算散列值的算法插入6个桶,第七个可能就重复了,当你插入数少的时候,都处于不同的桶,用hashcode就可能会按顺序

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

回复 使用道具 举报
黑马网友  发表于 2011-9-27 12:15:18
藤椅
之所以是这种结果是因为HashSet集合根据自己的hashCode和equals方法来算出存储到自己集合中的对象的值,这些值是有顺序的,例如第一个存储的对象的值为4,第二个存储的对象的值是2,第三个存储的对象的值是3,第四个存储的对象的值是1,那么在迭代输出是就会按着这些对象的值从小到大进行输出。HashSet也正是根据这些对象的值来保证元素不能重复的,如果两个对象的值一致则会让后一个对象覆盖掉前一个对象。

评分

参与人数 1技术分 +2 收起 理由
wangfayin + 2

查看全部评分

回复 使用道具 举报
黑马网友  发表于 2011-9-27 12:13:58
沙发
每一个对象都有一个固定的hashcode,而hashset是以hashcode值的大小来存储对象的,所以不管你存入的对象顺序如何,取出的顺序总是一样的。

评分

参与人数 1技术分 +2 收起 理由
wangfayin + 2

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马