1. 程式人生 > 實用技巧 >Java集合包(十)——Set的兩個實現類

Java集合包(十)——Set的兩個實現類

一:HashSet

  1、特徵

  1)HashSet 是一個沒有重複元素的集合

  2)不保證元素的順序,而且HashSet允許使用 null 元素

  3)HashSet是非執行緒安全的

  2、原理

public class HashSet<E>
    extends AbstractSet<E>
    implements Set<E>, Cloneable, java.io.Serializable
{
    static final long serialVersionUID = -5024744406713321676L;

    
// HashSet是通過map(HashMap物件)儲存內容的 private transient HashMap<E,Object> map; // PRESENT是向map中插入key-value對應的value // 因為HashSet中只需要用到key,而HashMap是key-value鍵值對; // 所以,向map中新增鍵值對時,鍵值對的值固定是PRESENT private static final Object PRESENT = new Object(); ...... }

  原理很簡單:HashSet中通過一個HashMap成員來儲存資料,其中set的元素就是hashMap的key,而值則恆定使用一個final成員object物件來佔位。

  由於hashMap的key是不允許重複的,因此保證了HashSet的元素不重複。

二:TreeSet

  1、特徵

  1)TreeSet 是一個有序的集合

  2)TreeSet是非執行緒安全的

  2、原理

public class TreeSet<E> extends AbstractSet<E>
    implements NavigableSet<E>, Cloneable, java.io.Serializable
{
    // NavigableMap物件:此處使用了多型,實際上它指向一個TreeMap例項
    private
transient NavigableMap<E,Object> m; // TreeSet是通過TreeMap實現的, // PRESENT是鍵-值對中的值。 private static final Object PRESENT = new Object(); // 不帶引數的建構函式。建立一個空的TreeMap public TreeSet() { this(new TreeMap<E,Object>()); } // 將TreeMap賦值給 "NavigableMap物件m" TreeSet(NavigableMap<E,Object> m) { this.m = m; } // 帶比較器的建構函式。 public TreeSet(Comparator<? super E> comparator) { this(new TreeMap<E,Object>(comparator)); } ...... }

  原理很簡單:TreeSet中使用了一個NavigableMap 成員,它是TreeMap的基類,在建構函式中可以傳入比較器建立一個TreeMap來儲存set的元素並且藉助treeMap的比較器來保證有序。