Treeset和hashset的區別

HashSet     哈希算法,散列存儲結構
TreeSet     二叉樹算法

(1)HashSet有以下特點

  • 不能保證元素的排列順序,順序有可能發生變化
  • 集合元素可以是null,但只能放入一個null
  • 線程不安全
  • 可以放不同的對象
  • 不能重複

當向HashSet集合中存入一個元素時,HashSet會調用該對象的hashCode()方法來得到該對象的hashCode值,然後根據 hashCode值來決定該對象在HashSet中存儲位置。
簡單的說,HashSet集合判斷兩個元素相等的標準是兩個對象通過equals方法比較相等,並且兩個對象的hashCode()方法返回值相等
注意,如果要把一個對象放入HashSet中,重寫該對象對應類的equals方法,也應該重寫其hashCode()方法。其規則是如果兩個對象通過equals方法比較返回true時,其hashCode也應該相同。另外,對象中用作equals比較標準的屬性,都應該用來計算 hashCode的值。
HashSet是由一個hash表來實現的,因此,它的元素是無序的。add(),remove(),contains()方法的時間複雜度是O(1)。

(2)TreeSet類

  • 有序,支持自然排序和定製排序
  • 不允許爲null
  • 線程不安全
  • 只能放同一類的對象
  • 不能重複

TreeSet是SortedSet接口的唯一實現類,TreeSet可以確保集合元素處於排序狀態。
TreeSet支持兩種排序方式,自然排序和定製排序,其中自然排序爲默認排序方式。向TreeSet中加入的應該是同一個類的對象
TreeSet判斷兩個對象不相等的方式是兩個對象通過equals方法返回false,或者通過CompareTo方法比較沒有返回0
自然排序
自然排序使用要排序元素的CompareTo(Object obj)方法來比較元素之間大小關係,然後將元素按照升序排列。
Java提供了一個Comparable接口,該接口裏定義了一個compareTo(Object obj)方法,該方法返回一個整數值,實現了該接口的對象就可以比較大小。
obj1.compareTo(obj2)方法如果返回0,則說明被比較的兩個對象相等,如果返回一個正數,則表明obj1大於obj2,如果是 負數,則表明obj1小於obj2。
如果我們將兩個對象的equals方法總是返回true,則這兩個對象的compareTo方法返回應該返回0
定製排序
自然排序是根據集合元素的大小,以升序排列,如果要定製排序,應該使用Comparator接口,實現 int compare(T o1,T o2)方法。
TreeSet是由一個樹形的結構來實現的,它裏面的元素是有序的。因此,add(),remove(),contains()方法的時間複雜度是O(logn)。

最重要:

1、TreeSet 是二差樹實現的,Treeset中的數據是自動排好序的,不允許放入null值。
2、HashSet 是哈希表實現的,HashSet中的數據是無序的,可以放入null,但只能放入一個null
3、兩者中的值都不能重複,就如數據庫中唯一約束。
4、HashSet要求放入的對象必須實現HashCode()方法,放入的對象,是以hashcode碼作爲標識的,而具有相同內容的String對象,hashcode是一樣,所以放入的內容不能重複。但是同一個類的對象可以放入不同的實例 。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章