中易网

HashSet和TreeSet的区别??

答案:3  悬赏:60  
解决时间 2021-04-07 19:45
最近学到数据结构,对于二者感到迷惑,只知道前者有序,后者无序,两者都不能有重复元素。我想知道TreeSet是怎么实现有序的,它是按什么规则排序的?另外就是它们怎么保证元素的不重复,是根据什么判断两个元素相同而不再添加的呢?
不希望看到复制的东西,看了好多网页都差不多,还有些是复制的API上的
最佳答案
保证元素不重复是通过元素的hashCode()和equals()两分方法判断的,因此用hashSet的元素要求重写这两个方法,而实现TreeSet有序,底层是用Map来实现的,这个可在源代码里可看到
全部回答
那就自己去看源码了!打开eclipse,就能定位到源码,自己看去吧
==========================他们的区别=========================== 1.hashset是通过hashmap实现的,treeset是通过treemap实现的,只不过set用的只是map的key 2.map的key和set都有一个共同的特性就是集合的唯一性.treemap更是多了一个排序的功能. 3.hashcode和equal()是hashmap用的,因为无需排序所以只需要关注定位和唯一性即可. a.hashcode是用来计算hash值的,hash值是用来确定hash表索引的. b.hash表中的一个索引处存放的是一张链表,所以还要通过equal方法循环比较链上的每一个对象 才可以真正定位到键值对应的entry. c.put时,如果hash表中没定位到,就在链表前加一个entry,如果定位到了,则更换entry中的value,并返回旧value 4.由于treemap需要排序,所以需要一个comparator为键值进行大小比较.当然也是用comparator定位的. a.comparator可以在创建treemap时指定 b.如果创建时没有确定,那么就会使用key.compareto()方法,这就要求key必须实现comparable接口. c.treemap是使用tree数据结构实现的,所以使用compare接口就可以完成定位了. =====================================他们的用法====================== hashset的使用 importjava.util.hashset; importjava.util.iterator; publicclasswpsklhashset { //java中set的使用(不允许有重复的对象): publicstaticvoidmain(string[]args) { hashsethashset=newhashset(); stringa=newstring("a"); stringb=newstring("b"); stringc=newstring("b"); hashset.add(a); hashset.add(b); system.out.println(hashset.size()); stringcz=hashset.add(c)?"此对象不存在":"已经存在"; system.out.println("测试是否可以添加对象"+cz); system.out.println(hashset.isempty()); //测试其中是否已经包含某个对象 system.out.println(hashset.contains("a")); iteratorir=hashset.iterator(); while(ir.hasnext()) { system.out.println(ir.next()); } //测试某个对象是否可以删除 system.out.println(hashset.remove("a")); system.out.println(hashset.remove("a")); //经过测试,如果你想再次使用ir变量,必须重新更新以下 ir=hashset.iterator(); while(ir.hasnext()) { system.out.println(ir.next()); } } } importjava.util.treeset; importjava.util.iterator; publicclasstreesettest { publicstaticvoidmain(string[]args) { treesettree=newtreeset(); tree.add("china"); tree.add("america"); tree.add("japan"); tree.add("chinese"); iteratoriter=tree.iterator(); while(iter.hasnext()) { system.out.println(iter.next()); } } } 以上就是他们的区别和用法,重在理解,多用,祝你成功
我要举报
如以上问答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
2016东莞名家具展主要开几次展 2016东莞名家
求女主会魔法的人真人电影或连续剧
虚拟家庭小人能活到多少岁
周六周末银行上班吗
《白毛女》中白毛仙姑是指谁?
理会是不是冷漠的反义词
怀远公务员工资什么时候和蚌埠一样
王先生想为自己的儿子找一位英语教师,要求能
刑拘时间怎么算刑期
压面条时能放少许糯米粉吗?
海洋装饰材料城这个地址在什么地方,我要处理
月经周期由六天变成了四天,且一直规律,这正常
酮替芬分散片的作用
中科院上海药物研究所和华东理工大学药学院考
尾房会便宜吗
推荐资讯
金马国旅在广东江门有无营业点
麻阳县吕家坪镇卫生院这个地址在什么地方,我
红都阳光商务会馆A座我想知道这个在什么地方
有道云笔记账号在哪里看
哈尔威船长是哪个国家的人?
阿拉斯加把小面包的纸吃了
世界上货运量最大的河流
我的是苹果iPhone6,求网友推荐音乐播放器。
为什么我在maven web项目里配置struts或sprin
为什么 有的附近人所一句不回我,能加好友 有
工程造价专业是做什么的?
九局重生伴奏刚开始播放的背景音乐完整版
手机登qq时,显示手机磁盘不足,清理后重新登
刺客的套装怎么选啊?