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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 李节起 中级黑马   /  2012-4-11 23:05  /  17149 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

HashSet存入和取出的顺序不一定一致,元素不可以重复。
但是顺序不一致,但也不是随机的顺序!
比如:
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("IT");
                        System.out.println(it.next());
                }
输出一直是这样:
ITjava04
ITjava02
ITjava03
ITjava01

在原理上,这由什么决定?

5 个回复

倒序浏览
之所以是这种结果是因为HashSet集合根据自己的hashCode和equals方法来算出存储到自己集合中的对象的值,这些值是有顺序的,例如第一个存储的对象的值为4,第二个存储的对象的值是2,第三个存储的对象的值是3,第四个存储的对象的值是1,那么在迭代输出是就会按着这些对象的值从小到大进行输出。HashSet也正是根据这些对象的值来保证元素不能重复的,如果两个对象的值一致则会让后一个对象覆盖掉前一个对象。
回复 使用道具 举报
HashSet类继承自AbstractSet抽象类,并且实现Set接口.HashSet类集使用哈希表进行存储,HashSet不保证集合的迭代顺序;特别是HashSet不保证该顺序恒久不变.HashSet类声明如下::
public class HashSet<E>extends AbstractSet<E>implements Set<E>, Cloneable, Serializable此类实现 Set 接口,由哈希表(实际上是一个 HashMap 实例)支持。它不保证集合的迭代顺序;特别是它不保证该顺序恒久不变。此类允许使用 null 元素。
此类为基本操作提供了稳定性能,这些基本操作包括 add、remove、contains 和 size,假定哈希函数将这些元素正确地分布在桶中。对此集合进行迭代所需的时间与 HashSet 实例的大小(元素的数量)和底层 HashMap 实例(桶的数量)的“容量”的和成比例。因此,如果迭代性能很重要,则不要将初始容量设置得太高(或将加载因子设置得太低)。

如果你想按顺序打印的话  就用List吧  List是有序可以重复的,Set集合是无序的 ,不可以重复的.
回复 使用道具 举报
HashSet添加元素时,先比较hashCode是否相同,若不同,则判为不同的元素,加进集合;若是hashCode相同,还会进行equals比较,若此时equals不同,也会判为不同元素,若equals相同,则是重复元素.(添加元素的具体顺序和hashCode有关);
你的例子中出现那种情况的主要原因是: 元素都是String类型的,查看API的String的hashCode:
       返回此字符串的哈希码。String 对象的哈希码根据以下公式计算:
        s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1]
你的几个String也就最后一位不同,所以出现貌似有序的假象!!!!
回复 使用道具 举报
HashSet 的底层存储数据结构是哈希表,它是根据哈希值和equals方法来确保集合中元素的唯一性。如果一个元素要存入,首先会判断集合是否存在与该元素的hashCode相同的元素。如果不存在,则把该元素存入HashSet 集合,如果存在,则调用equals继续比较。如果equals方法返回true,证明集合已经存在该元素,所以不添加,如果返回false,证明该元素在集合中存在一个相同哈希值内容不同元素,所以把该元素添加到与该元素哈希值的元素后面。
回复 使用道具 举报
  如你想深入理解,应去看算法,或数据结构的相关章节。哈希表的思想:每个元素作为变量,通过一定的函数关系计算出函数的值,把这个值作为数组的下标,将元素存入对应的数组元素中。那函数称为哈希函数,函数的值称为哈希地址。
  例如,有4个数:1,30,5,12,假设用“%10"为哈希函数,那么哈希运算后得值:1,0,5,2。“%10"后的值有10种可能,所以设10个存储地址,0就保存到地址0,1就保存到地址1,2就保存到地址2,5就保存到地址5。这样做的好处是,查找非常快,如找12,12%10=2,就到地址2 去取,什么索引查找、折半查找都不能相比,特别是数据量大时。当然哈希函数是很复杂的,不会取余那么简单。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马