HashSet和TreeSet的区别(转+完善)
==========================它们的区别===========================
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.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;}@Overridepublic int compareTo(Object o) {return userName.compareTo(((User)o).toString());}}