天天看點

HashSet、LinkedHashSet、TreeSet的差別

HashSet:哈希表是通過使用稱為散列法的機制來存儲資訊的,元素并沒有以某種特定順序來存放;

LinkedHashSet:以元素插入的順序來維護集合的連結表,允許以插入的順序在集合中疊代;  

TreeSet:提供一個使用樹結構存儲Set接口的實作,對象以升序順序存儲,通路和周遊的時間很快。

package com.test;  
  
import java.util.HashSet;  
import java.util.LinkedHashSet;  
import java.util.TreeSet;  
  
public class SetDemo {  
  
    public static void main(String[] args) {  
  
        HashSet<String> hs = new HashSet<String>();  
        hs.add("B");  
        hs.add("A");  
        hs.add("D");  
        hs.add("E");  
        hs.add("C");  
        hs.add("F");  
        System.out.println("HashSet 順序:\n"+hs);  
          
        LinkedHashSet<String> lhs = new LinkedHashSet<String>();  
        lhs.add("B");  
        lhs.add("A");  
        lhs.add("D");  
        lhs.add("E");  
        lhs.add("C");  
        lhs.add("F");  
        System.out.println("LinkedHashSet 順序:\n"+lhs);  
          
        TreeSet<String> ts = new TreeSet<String>();  
        ts.add("B");  
        ts.add("A");  
        ts.add("D");  
        ts.add("E");  
        ts.add("C");  
        ts.add("F");  
        System.out.println("TreeSet 順序:\n"+ts);  
    }  
}
           

輸出結果:

HashSet 順序:
[D, E, F, A, B, C]
 LinkedHashSet 順序:
[B, A, D, E, C, F]
TreeSet 順序:
[A, B, C, D, E, F]
           

另外,重點差別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.com

http://www.cnblogs.com/ibook360/archive/2011/11/28/2266062.html

http://blog.csdn.net/foart/article/details/4263456

繼續閱讀