最近学到数据结构,对于二者感到迷惑,只知道前者有序,后者无序,两者都不能有重复元素。我想知道TreeSet是怎么实现有序的,它是按什么规则排序的?另外就是它们怎么保证元素的不重复,是根据什么判断两个元素相同而不再添加的呢?
不希望看到复制的东西,看了好多网页都差不多,还有些是复制的API上的
HashSet和TreeSet的区别??
答案:3 悬赏:60
解决时间 2021-04-07 19:45
- 提问者网友:星空下的寂寞
- 2021-04-07 01:04
最佳答案
- 二级知识专家网友:风格单纯
- 2021-04-07 01:14
保证元素不重复是通过元素的hashCode()和equals()两分方法判断的,因此用hashSet的元素要求重写这两个方法,而实现TreeSet有序,底层是用Map来实现的,这个可在源代码里可看到
全部回答
- 1楼网友:恕我颓废
- 2021-04-07 03:43
那就自己去看源码了!打开eclipse,就能定位到源码,自己看去吧
- 2楼网友:夢想黑洞
- 2021-04-07 02:35
==========================他们的区别===========================
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());
}
}
}
以上就是他们的区别和用法,重在理解,多用,祝你成功
我要举报
如以上问答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯