黑马程序员技术交流社区
标题:
请问HashSet是无序的,这句话怎么理解
[打印本页]
作者:
冯超
时间:
2013-4-14 16:10
标题:
请问HashSet是无序的,这句话怎么理解
本帖最后由 冯超 于 2013-4-15 09:56 编辑
:L:L
package threeCollection;
import java.util.HashSet;
import java.util.Iterator;
public class SetTest {
/**
* @param args
*/
//set集合石一种不包含重复元素的Collection
public static void main(String[] args) {
// TODO Auto-generated method stub
hashSetTest();
}
//HashSet:和存放顺序无关,反正结果是无序的;最多只能放入一个null值;不能有重复元素
public static void hashSetTest() {
HashSet hs = new HashSet();
for(int i = 0; i < 10; i++) {
hs.add(new Integer(i));
}
hs.add("xx");
hs.add(12f);
hs.add("xa");
hs.add("xx");
//用迭代器输出
Iterator it = hs.iterator();
while(it.hasNext()) {
Object obj = it.next();
System.out.print(obj + " ");
}
}
}
复制代码
下午复习Collcetion集合的时候,查资料发现这句话没理解。
打印结果是有序的····:L
作者:
冯超
时间:
2013-4-14 16:21
追加一问:treeSet如何提取有序的序列···········?
作者:
赵晓东
时间:
2013-4-14 16:23
意思就是只要你不复写它的hashCode和equals方法,他就是无序的,你要想要让它有序,就必须重写这两个方法
作者:
冯超
时间:
2013-4-14 17:21
赵晓东 发表于 2013-4-14 16:23
意思就是只要你不复写它的hashCode和equals方法,他就是无序的,你要想要让它有序,就必须重写这两个方法 ...
那我可以吧写个方法也可以把数组搞成有序的,把所有集合都搞成有序的···有意义么?
作者:
沈浩
时间:
2013-4-14 17:41
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 这就是无序
作者:
小黑黑
时间:
2013-4-14 22:34
下面是我根据一些资料和自己的理解整理的,希望对你有帮助
哈希表简介:
1)哈希表是按照哈希值的大小进行排列的,如果两个哈希值不同,则大的值放后面;如果两个哈希值相同,则再用equals方法比较两个元素的对象是否相同,如果不同,则将第二个值顺延,两个值串起来,放在同一个位置上。
2)取值时是按照哈希值取出来的。
3)哈希值的取值方式:哈希值存入哈希表中,哈希表也称散列表。散列表是存放记录的数组。具体来说,散列表是根据散列函数H(Key)和处理冲突的方法将一组关键字映象到一个有限的连续的地址集(区间)上,并以关键字在地址集中的“象”,作为这条记录在表中的存储位置,这种表表称为散列表,这一映象过程就称为散列造表或散列,所存储位置称为散列地址(这是百度百科上的内容)。我的理解是:存入的对象的地址是通过提取其信息摘要,通过散列函数计算而获得的一个关键码(Key)即哈希值,然后将这个值存入哈希表,而哈希表的存值方式是按照哈希值的大小顺序存储的,并且在这个哈希表中有自己的索引,但是哈希表的取值方式并不是按照索引的方式取出的。取出方式是按照哈希表中特有的算法取出的哈希值(注意,现在说的是哈希值,不是元素的取出),这些算法有直接寻址法、折叠法、平方取中法以及其他的一些方法等等。具体是按哪种算法查找的,我并不太清楚,所以,取出的哈希值可能就不是按照哈希值的大小顺序取出的了。
作者:
Alan
时间:
2013-4-15 01:08
此类实现 Set 接口,由哈希表(实际上是一个 HashMap 实例)支持。
它不保证 set 的迭代顺序;特别是它不保证该顺序恒久不变。
此类允许使用 null 元素。 楼主多试几次就能看到结果
作者:
本人已死
时间:
2013-4-15 07:44
hashset:底层数据结构是哈希表。hashset的无序指的是存入和取出的顺序不一致,导致这的原因是hashset集合的取出时根据存入时的哈希值取出的。
不能存储相同元素因为哈希表具有唯一性:是通过元素的两个方法hashcode和equals来完成
如果hashcode值相同,才会判断equals是否为true
如果元素的hashset值不同,不会调用equals,所以每个元素的哈希值都是不同的
注意:对于判断元素是否存在以及删除添加等操作依赖的是元素的hashcode和equals方法
作者:
kkzxak47
时间:
2013-4-15 14:03
如果真想弄明白最最底层的原理,看看数据结构的“查找”“哈希表”,你就会清清楚楚。
作者:
李永康
时间:
2013-4-15 21:30
所谓无序,就是没有顺序。比如说,不输入的是:zhangsan,lisi,wangwu,zhaoer.
所谓重复,就是不能出现相同的元素。
那么他输出的就是乱的,每次运行的结果都是不一样的。
那么有序呢。就是按照你指定的顺序排列,一般是按照字母顺序表。
当然,你的不一定是字母,也可以是数字。或者其他能代表顺序的东西。这是,你要做的就是排序。
排序,从写hashcode.
重复,重写eques.
有些地方记不清,错了请指出。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2