HashSet和TreeSet的区别(转+完善)
程序员文章站
2022-05-21 17:11:24
...
==========================它们的区别===========================
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无序
TreeSet有序
二者里边不能有重复的对象
=====================================他们的用法======================
1、在HashSet中如何确定对象的唯一呢,在进行集合的操作时,用equal方法来判断对象是否唯一。这里要强调的是,在java里千万要警惕 == 操作符,==是判断两个对象的物理地址的,没有任何业务意义。
源代码如下:
----------------------------------------------------------------------------
2、TreeSet的用法
参考链接:
http://blog.csdn.net/woisnong/article/details/7433453
http://mahilion.blog.163.com/blog/static/1830872952011429112232362/
http://hi.baidu.com/alexandrae2008/item/d770bc871caf285e26ebd9ca
http://www.cnblogs.com/jcli/archive/2011/08/09/2132191.html
题目来自:中视广信2013笔试题
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无序
TreeSet有序
二者里边不能有重复的对象
=====================================他们的用法======================
1、在HashSet中如何确定对象的唯一呢,在进行集合的操作时,用equal方法来判断对象是否唯一。这里要强调的是,在java里千万要警惕 == 操作符,==是判断两个对象的物理地址的,没有任何业务意义。
源代码如下:
import java.util.HashSet; import java.util.Iterator; import java.util.Set; public class Test4_HashSet { private HashSet<Users> usersSet = new HashSet<Users>(); private void printElement(Set usersSet){ Iterator it = usersSet.iterator(); while(it.hasNext()){ System.out.println(((Users)it.next()).toString()); } } public static void main(String[] args) { Test4_HashSet t4 = new Test4_HashSet(); for(int i=0;i<10;i++){ Users users = new Users("users"+i); t4.usersSet.add(users); } //添加相同字符串users5的对象,要保证HashSet内对象唯一,需重写HashSet中对象继承自Object的equals()和hashCode()方法 Users users = new Users("users"+5); t4.usersSet.add(users); System.out.println("****"+t4.usersSet.size()); t4.printElement(t4.usersSet); } } class Users{ private String usersName; public Users(String usersname){ this.usersName = usersname; } public String getUsersName() { return usersName; } public void setUsersName(String usersName) { this.usersName = usersName; } public String toString(){ return usersName; } //若想实现HashSet中对象的唯一性判断,必须使用对象中的唯一性属性生成hashCode,如usersName.hashCode() @Override public int hashCode() { return usersName.hashCode(); } @Override public boolean equals(Object obj) { return usersName.equals(((Users)obj).getUsersName()); } }
----------------------------------------------------------------------------
2、TreeSet的用法
import java.util.Iterator; import java.util.Set; import java.util.TreeSet; public class Test4_TreeSet { /** * 通过这个程序,还可以测试树集的添加元素的无序性与输出的有序性 */ private Set<User> userSet = new TreeSet<User>(); private void printElement(Set userSet){ Iterator it = userSet.iterator(); while(it.hasNext()){ System.out.println(((User)it.next()).toString()); } } public static void main(String[] args) { Test4_TreeSet t4 = new Test4_TreeSet(); for(int i=0;i<10;i++){ User user = new User("user"+i); t4.userSet.add(user); } User user = new User("user"+5); t4.userSet.add(user); System.out.println("****"+t4.userSet.size()); t4.printElement(t4.userSet); } } /** *TreeSet.add(Comparable o),该方法添加的对象必须实现Comparable接口,否则会报错 *若想实现TreeSet中的对象在插入时自动排序,也必须实现Comparable接口,覆盖compareTo()方法 **/ class User implements Comparable{ private String userName; public User(String username){ this.userName = username; } public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } public String toString(){ return userName; } @Override public int compareTo(Object o) { return userName.compareTo(((User)o).toString()); } }
参考链接:
http://blog.csdn.net/woisnong/article/details/7433453
http://mahilion.blog.163.com/blog/static/1830872952011429112232362/
http://hi.baidu.com/alexandrae2008/item/d770bc871caf285e26ebd9ca
http://www.cnblogs.com/jcli/archive/2011/08/09/2132191.html
题目来自:中视广信2013笔试题
上一篇: Java中父类方法与子类方法的执行顺序
下一篇: 加载JDBC驱动的三种方式(转)
推荐阅读
-
rem与em的使用和区别详解【转】
-
Java自学-集合框架 ArrayList和HashSet的区别
-
引入CSS 的两种方式:link和@import的区别[转]
-
[转]诡异的现象:发现文档类mouseChildren和其他Sprite的区别
-
[转] DSA 和 RSA 的区别
-
【转】三个案例带你看懂LayoutInflater中inflate方法两个参数和三个参数的区别
-
(转)struts2中redirect,redirectAction和chain的区别 以及 如何在action之间传参数
-
Java中equals,hashcode和==的区别(转)
-
备战蓝桥杯java(十一):算法竞赛中的常用API :HashSet 和 TreeSet
-
sleep和wait的区别(转)