黑马程序员技术交流社区

标题: 问HashSet的存储 [打印本页]

作者: 盖保宁    时间: 2011-9-27 11:44
标题: 问HashSet的存储
老师讲过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
有谁能从原理上解释一下
作者: 匿名    时间: 2011-9-27 12:13
每一个对象都有一个固定的hashcode,而hashset是以hashcode值的大小来存储对象的,所以不管你存入的对象顺序如何,取出的顺序总是一样的。
作者: 匿名    时间: 2011-9-27 12:15
之所以是这种结果是因为HashSet集合根据自己的hashCode和equals方法来算出存储到自己集合中的对象的值,这些值是有顺序的,例如第一个存储的对象的值为4,第二个存储的对象的值是2,第三个存储的对象的值是3,第四个存储的对象的值是1,那么在迭代输出是就会按着这些对象的值从小到大进行输出。HashSet也正是根据这些对象的值来保证元素不能重复的,如果两个对象的值一致则会让后一个对象覆盖掉前一个对象。
作者: 匿名    时间: 2011-9-27 12:30
貌似曾经好像有人这样说:
存入散列本来就是为了节约空间,假如有10个散列桶,可能计算散列值的算法插入6个桶,第七个可能就重复了,当你插入数少的时候,都处于不同的桶,用hashcode就可能会按顺序
作者: 匿名    时间: 2011-9-27 19:40
标题: HashSet
你就把hashSet的实现的数据结构看做是堆栈和队列的相结合
而且事先你是不知道那个先进先出的情况   当取出来的结果  你就没那么难理解了   因为你都不知道那个先进    所以取出来的结果是多样的也有可能  如果你理解不了  多少是受List集合的影响!
有点像买六合彩  不是有很多号码吗?
作者: 匿名    时间: 2011-9-28 18:51
对于楼主在控制台输出的顺序,我觉得是不同的  在我的电脑上就不是那样的顺序输出的
    因为Hashset集合是一个无序的集合,在集合中只有List集合是天生有顺序的.
       很多人说HashSet是没有索引的,其实当向HashSet集合添加元素时,HashSet会根据该元素的hashCode值来决定它的存储位置——也就是说每个元素的hashCode值就是该元素的索引。
如果要使得Set集合有顺序可以使用HashSet的子类LinkedHashSet,他的是内需默认就是插入的顺序,
     另外当时使用Hashset集合时,往集合添加的元素要覆写hashCode和equals方法,因为Set集合是不允许重复的
作者: 匿名    时间: 2011-9-29 18:04
标题: hashset的特性解析。
简单的说一下hashset的底层数据结构,您就可以明白,为什么老师会那样说了!
           原理:hashset的底层数据结构是hash表,当我们将某个值传入hash表中的时候他会先调用这个对象的hashcode方法,计算出hashcode的值,然后将这个值存入到对应的hash表中,当我们在将一个值传入的时候,它还是会算出hashcode的方法,如果这个hash值的值与上一个的值不同,那么就会对号入座,将值存入hash表中,如果相同,那么这个对象就会调用equals方法与上一个对象比较,如果返回true则不存入,如果返回false就存入。
          应用:我们在实际开发中会用到hashset而这时一般都要重写传入hashset方法中对象的hashcode方法,和equals方法!在写方法的时候我们一定要遵循“属性值相同则尽量让hashcode相同,如果属性不同那么一定要让hashcode不同!”
         【拓展:】在重写hashcode方法时遵循的原则:“属性值相同则尽量让hashcode相同,如果属性不同那么一定要让hashcode不同”




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