HashSet内部是根据什么排序的?? 虽说HashSet是无序的,也就是说存入的顺序和取出的顺序不一致,但是在HashSet内部却还是有顺序的,因为每次将HashSet集合对象迭代打印出来的顺序是一致的,那么内部是根据什么排序...求解? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 hash值吧,很好的问题。看看源代码更确定。每个对象都有hashCode()这个方法,是继承自Object的,所有根据hash值来排序是很合理的。 HashSet是无序的,如果你要排序的set那么用TreeSet。Set的内部实现都是使用了Map.你可以看看JDk的源码. 哈希表的基本思想是:以线性表中每个元素的关键字key为自变量,通过一定的函数关系h(key)计算出函数的值,把这个值作为数组的下标,将元素存入对应的数组元素中。 HashSet内部的存储是由hash函数定的,例如:13,11,5,7,19;hash函数假设是%9,运算得:4,2,5,7,1,那么地址1是19,地址2是11,地址4是13,地址5是5,地址7是7。 真正的hash函数较复杂,它要尽量保证两个数运算后,得到的值不一样,如相同,则属于冲突,由一冲突程序处理。 HashSet就是采用哈希算法存取对象的集合,它内部采用对某个数字n进行取余的方式对哈希码进行分组和划分对象的存储区域。Object类中定义了一个hashCode()方法来返回每个Java对象的哈希码,当从HashSet集合中查找某个对象时,Java系统首先调用对象的hashCode()方法获得该对象的哈希码,然后根据哈希码找到相应的存储区域,最后取出该存储区域内的每个元素与该对象进行equals方法比较,这样不用遍历集合中的素有元素就可以的到结论。可见,HashSet集合具有很好的对象检索性能,但是,HashSet集合存储对象的效率相对要低些,因为向HashSet集合中添加一个对象时,要先计算出对象的哈希码和根据这个哈希码确定对象在集合中的存放位置。 是根据Hashcode 哈希值确定的 编写很多类都需要重写HashCode()方法 不然你排序的时候会出现混乱 根据api的解释来讲:此类实现 Set 接口,由哈希表(实际上是一个 HashMap 实例)支持。它是按照hashcode来排序的。我用程序测试了下:如果set里面全是单个的字节,它就是按照hashcode的大小来排序,可是不是的话,它的排序就变得不能理解,但是肯定是根据hsahcode来排序的。代码如下java code:package collection;import java.util.HashSet;import java.util.Iterator;import java.util.Set;public class TestHashSet { static Set<String> set = new HashSet<String>(); public static void test(){ set.add("A"); set.add("C"); set.add("BC"); set.add("123"); Iterator<String> it = set.iterator(); while(it.hasNext()){ String element = it.next(); System.out.println(element+""+element.hashCode()); } } public static void main(String[] args){ test(); } } 大哥,HashSet是基于HashMap实现的,HashSet的元素是HashMap的键,这样就能去重。顺序就是HashMap中元素的顺序。 关于java观察者模式使用求助 谁设计过oa的计划任呀? 原来还真有弱引用,到底是做什么用的?? 求助 如何将文件名为aaa\abc\efg\aa.xls转换成aaa\\abc\\efg\\aa.xls 关于JOptionPane.showInputDialog的一个问题 大虾们来帮我看看怎么会有这种运行结果 哪儿有JMF-----javax.media.*包下载??? 哪里有jdatastore下载!(不会是小孩提出的问题吧!) 请问父类声明实现一个接口,但子类又声明实现同一个接口有什么意义? 求安卓高手解决 一个类实现一个接口 算不算继承
每个对象都有hashCode()这个方法,是继承自Object的,所有根据hash值来排序是很合理的。
13,11,5,7,19;hash函数假设是%9,运算得:4,2,5,7,1,那么地址1是19,地址2是11,地址4是13,地址5是5,地址7是7。
真正的hash函数较复杂,它要尽量保证两个数运算后,得到的值不一样,如相同,则属于冲突,由一冲突程序处理。
java code:
package collection;import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;public class TestHashSet { static Set<String> set = new HashSet<String>(); public static void test(){
set.add("A");
set.add("C");
set.add("BC");
set.add("123");
Iterator<String> it = set.iterator();
while(it.hasNext()){
String element = it.next();
System.out.println(element+""+element.hashCode());
}
}
public static void main(String[] args){
test();
}
}
顺序就是HashMap中元素的顺序。