社区
Java SE
帖子详情
HashSet内部是根据什么排序的??
a920123164
2011-12-04 11:21:03
虽说HashSet是无序的,也就是说存入的顺序和取出的顺序不一致,但是在HashSet内部却还是有顺序的,因为每次将HashSet集合对象迭代打印出来的顺序是一致的,那么内部是根据什么排序...求解?
...全文
1167
10
打赏
收藏
HashSet内部是根据什么排序的??
虽说HashSet是无序的,也就是说存入的顺序和取出的顺序不一致,但是在HashSet内部却还是有顺序的,因为每次将HashSet集合对象迭代打印出来的顺序是一致的,那么内部是根据什么排序...求解?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
10 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
xf7633
2011-12-06
打赏
举报
回复
根据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();
}
}
zhouYunan2010
2011-12-06
打赏
举报
回复
大哥,HashSet是基于HashMap实现的,HashSet的元素是HashMap的键,这样就能去重。
顺序就是HashMap中元素的顺序。
hq333
2011-12-05
打赏
举报
回复
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函数较复杂,它要尽量保证两个数运算后,得到的值不一样,如相同,则属于冲突,由一冲突程序处理。
hq333
2011-12-05
打赏
举报
回复
哈希表的基本思想是:以线性表中每个元素的关键字key为自变量,通过一定的函数关系h(key)计算出函数的值,把这个值作为数组的下标,将元素存入对应的数组元素中。
fuqinyijiu
2011-12-05
打赏
举报
回复
是hashcode,
luckdjc
2011-12-05
打赏
举报
回复
是根据Hashcode 哈希值确定的 编写很多类都需要重写HashCode()方法 不然你排序的时候会出现混乱
liyang36939
2011-12-05
打赏
举报
回复
hash算法
luochengor
2011-12-05
打赏
举报
回复
HashSet就是采用哈希算法存取对象的集合,它内部采用对某个数字n进行取余的方式对哈希码进行分组和划分对象的存储区域。Object类中定义了一个hashCode()方法来返回每个Java对象的哈希码,当从HashSet集合中查找某个对象时,Java系统首先调用对象的hashCode()方法获得该对象的哈希码,然后根据哈希码找到相应的存储区域,最后取出该存储区域内的每个元素与该对象进行equals方法比较,这样不用遍历集合中的素有元素就可以的到结论。可见,HashSet集合具有很好的对象检索性能,但是,HashSet集合存储对象的效率相对要低些,因为向HashSet集合中添加一个对象时,要先计算出对象的哈希码和根据这个哈希码确定对象在集合中的存放位置。
xiongyu2006
2011-12-04
打赏
举报
回复
HashSet是无序的,如果你要排序的set那么用TreeSet。Set的内部实现都是使用了Map.你可以看看JDk的源码.
daijope
2011-12-04
打赏
举报
回复
hash值吧,很好的问题。看看源代码更确定。
每个对象都有hashCode()这个方法,是继承自Object的,所有根据hash值来排序是很合理的。
java中set、list和map的使用方法实例
// java中对象容器主要有Set,List和Map三个接口类。 // 迭代器(Iterator)模式,又叫做游标(Cursor)模式。 // GOF给出的定义为:提供一种方法访问一个容器(container)对象中的各个元素, // 而又不需暴露该对象的
内部
细节。 // 学习set对象容器的使用 // set容器中的对象不允许重复 // set容器接口的实现类有
HashSet
和 Linked
HashSet
两个 //
HashSet
不保证迭代顺序, Linked
HashSet
按照元素插入的顺序迭代. // 学习List对象容器的使用 // List容器中的对象允许重复 // 常用的list接口的实现类有ArrayList和LinkedList // 学习map对象容器的使用 // map对象容器里面储存的元素是(key,value)形式的键值对,比如(a,1)(b,20)(c,55) // key不可以重复,value可以重复 // 常用的map接口的实现类有HashMap,LinkedHashMap和TreeMap // HashMap不保证集合中元素的顺序, // LinkedHashMap按插入顺序
排序
// TreeMap按自己的意愿进行
排序
,默认按key值升序
排序
。 另包含一篇网文:在java中使用TreeMap进行中文
排序
HashSet
内部
的自动
排序
和去重原理
Hashset
内部
排序
是根据ASCII码进行
排序
HashSet
的自动取重是根据hashcode 和 equals 进行比较的,而不是直接使用等号,因为对于引用类型的数据来说,等于号比较的是引用之间的地址。
Java 中的
HashSet
,
内部
是如何工作的?
继续分享一道Java经典面试题: 题目描述: Java 中的
HashSet
,
内部
是如何工作的?
HashSet
的
内部
采用 HashMap来实现。由于 Map 需要 key 和 value,所以
HashSet
中所有 key 的都有一个默认 value。类似于 HashMap,
HashSet
不允许重复的 key,只允许有一个null key,意思就是
HashSet
中只
为何有时候
HashSet
输出会有序?浅析
HashSet
底层是如何“
排序
”的
问题再现 我们都知道Set集合是无序的。此处的无序体现在,一般情况下,输出顺序和输入顺序不同。并且“毫无规律”(先挖个坑,后面解释)。比如如下代码: Set<Integer> s = new
HashSet
<>(); s.add(37); s.add(16); s.add(4); s.add(23); s.add(1); s.add(6); ...
Java中的
HashSet
,
内部
是如何工作的?
HashSet
是Java中的一种集合,它基于哈希表实现,用于存储一组唯一的元素。
Java SE
62,615
社区成员
307,307
社区内容
发帖
与我相关
我的任务
Java SE
Java 2 Standard Edition
复制链接
扫一扫
分享
社区描述
Java 2 Standard Edition
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章