HashSet和TreeSet的區別

HashSet與TreeSet的區別  

一、HashSet:
此類實現 Set 接口,由哈希表(實際上是一個 HashMap 實例)支持。它不保證集合的迭代順序;特別是它不保證該順序恆久不變。此類允許使用 null 元素。
此類爲基本操作提供了穩定性能,這些基本操作包括 add、remove、contains 和 size,假定哈希函數將這些元素正確地分佈在桶中。對此集合進行迭代所需的時間與 HashSet 實例的大小(元素的數量)和底層 HashMap 實例(桶的數量)的“容量”的和成比例。因此,如果迭代性能很重要,則不要將初始容量設置得太高(或將加載因子設置得太低)。
注意,此實現不是同步的。如果多個線程同時訪問一個哈希 set,而其中至少一個線程修改了該 set,那麼它必須 保持外部同步。這通常是通過對自然封裝該 set 的對象執行同步操作來完成的。如果不存在這樣的對象,則應該使用 Collections.synchronizedSet 方法來“包裝” set。最好在創建時完成這一操作,以防止對該 set 進行意外的不同步訪問:
Set s = Collections.synchronizedSet(new HashSet(...));
我們應該爲要存放到散列表的各個對象定義hashCode()和equals();//用來判斷對象是否相等
public class HashTest {
 
 public static void main(String[] args)
    {
        HashSet<Integer> hash = new HashSet<Integer>();
        Random random = new Random();
        while(hash.size()!= 6){
         int randomValue = random.nextInt(33) + 1;
         hash.add(randomValue);
        }
        String result = "結果是:";
        for(Integer i: hash){
         result += i + " "; 
        }
       System.out.println(result);
    }
}
運行結果:
結果是:19 6 25 29 12 14 
結果是:16 4 5 25 12 31 


二、TreeSet:
基於 TreeMap 的 NavigableSet 實現。使用元素的自然順序對元素進行排序,或者根據創建 set 時提供的 Comparator 進行排序,具體取決於使用的構造方法。 
此實現爲基本操作(add、remove 和 contains)提供受保證的 log(n) 時間開銷。 
注意,如果要正確實現 Set 接口,則 set 維護的順序(無論是否提供了顯式比較器)必須與 equals 一致。(關於與 equals 一致 的精確定義,請參閱 Comparable 或 Comparator。)這是因爲 Set 接口是按照 equals 操作定義的,但 TreeSet 實例使用它的 compareTo(或 compare)方法對所有元素進行比較,因此從 set 的觀點來看,此方法認爲相等的兩個元素就是相等的。即使 set 的順序與 equals 不一致,其行爲也是 定義良好的;它只是違背了 Set 接口的常規協定。 
注意,此實現不是同步的。如果多個線程同時訪問一個 TreeSet,而其中至少一個線程修改了該 set,那麼它必須 外部同步。這一般是通過對自然封裝該 set 的對象執行同步操作來完成的。如果不存在這樣的對象,則應該使用 Collections.synchronizedSortedSet 方法來“包裝”該 set。此操作最好在創建時進行,以防止對 set 的意外非同步訪問: 

   SortedSet s = Collections.synchronizedSortedSet(new TreeSet(...));

public class HashTest {
 
 public static void main(String[] args)
    {
        TreeSet<Integer> tree = new TreeSet<Integer>();
        Random random = new Random();
        while(tree.size()!= 6){
         int randomValue = random.nextInt(33) + 1;
         tree.add(randomValue);
        }
        String result = "結果是:";
        for(Integer i: tree){
         result += i + " "; //空格
        }
       System.out.println(result);
    }
}
運行結果:
結果是:4 7 9 11 26 29 
結果是:3 9 14 24 27 32 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章