天天看點

java集合系列——Set之HashSet和TreeSet介紹(十)

一.Set的簡介

Set是一個不包含重複元素的 collection。更确切地講,set 不包含滿足 e1.equals(e2) 的元素。對 e1 和 e2,并且最多包含一個為 null 的元素。

Set的類關系圖:

java集合系列——Set之HashSet和TreeSet介紹(十)

1.繼承于Collection接口,具有增删查改的方法!

2.AbstractCollection抽象類,實作了Collection接口,并實作了裡面的一些方法,如isEmpty、contains等。

3.Set的兩個實作類,HashSet和TreeSet

- HashSet實作本質其實就是HashMap,HashSet裡面的元素是無序的。

- TreeSet實作本質其實就是TreeSet,TreeSet裡面的元素是有序的。

二.HashSet

1.概述

HashSet實作Set接口,那麼它也是一個不包含重複元素的一個無序的集合,允許使用null,有且僅有一個元素為null!

HashSet也是一個非同步的方法,如果要在多個線程中使用,要注意進行同步封裝!

Set s = Collections.synchronizedSet(new HashSet(...));
           

HashSet通過iterator()傳回的疊代器是fail-fast的。

2.繼承關系和API

HashSet API

類 HashSet<E>

java.lang.Object
  繼承者 java.util.AbstractCollection<E>
      繼承者 java.util.AbstractSet<E>
          繼承者 java.util.HashSet<E>
類型參數:
E - 此 set 所維護的元素的類型
所有已實作的接口:
Serializable, Cloneable, Iterable<E>, Collection<E>, Set<E>
           

LinkedHashSet繼承了HashSet,實作連結清單的set集合。

(1):構造方法

HashSet() 
          構造一個新的空 set,其底層 HashMap 執行個體的預設初始容量是 ,加載因子是 。
HashSet(Collection<? extends E> c) 
          構造一個包含指定 collection 中的元素的新 set。
HashSet(int initialCapacity) 
          構造一個新的空 set,其底層 HashMap 執行個體具有指定的初始容量和預設的加載因子()。
HashSet(int initialCapacity, float loadFactor) 
          構造一個新的空 set,其底層 HashMap 執行個體具有指定的初始容量和指定的加載因子。
           

(2)方法:

boolean    add(E e) 
          如果此 set 中尚未包含指定元素,則添加指定元素。
 void   clear() 
          從此 set 中移除所有元素。
 Object clone() 
          傳回此 HashSet 執行個體的淺表副本:并沒有複制這些元素本身。
 boolean    contains(Object o) 
          如果此 set 包含指定元素,則傳回 true。
 boolean    isEmpty() 
          如果此 set 不包含任何元素,則傳回 true。
 Iterator<E>    iterator() 
          傳回對此 set 中元素進行疊代的疊代器。
 boolean    remove(Object o) 
          如果指定元素存在于此 set 中,則将其移除。
 int    size() 
          傳回此 set 中的元素的數量(set 的容量)。
           

3.總結

HashSet中含有一個”HashMap類型的成員變量”map,HashSet的操作函數,實際上都是通過map實作的。

有兩種周遊的方式:

(1)使用 Iterator

第一步:根據iterator()擷取HashSet的疊代器。

第二步:周遊疊代器擷取各個元素。

for(Iterator iterator = set.iterator();
       iterator.hasNext(); ) { 
    iterator.next();
}
           

(2)使用foreach

第一步:根據toArray()擷取HashSet的元素集合對應的數組。

第二步:周遊數組,擷取各個元素。

Object[] object = (String[])set.toArray();
for (Object obj : object)
    System.out.printf(obj);
           

三.TreeSet

1.概述

基于 TreeMap 的 NavigableSet 實作。使用元素的自然順序對元素進行排序,或者根據建立 set 時提供的 Comparator進行排序,具體取決于使用的構造方法。

2.繼承關系和API

TreeSet API

(1)繼承關系:

類 TreeSet<E>

java.lang.Object
  繼承者 java.util.AbstractCollection<E>
      繼承者 java.util.AbstractSet<E>
          繼承者 java.util.TreeSet<E>
類型參數:
E - 此 set 維護的元素的類型
所有已實作的接口:
Serializable, Cloneable, Iterable<E>, Collection<E>, NavigableSet<E>, Set<E>, SortedSet<E>
           

繼承于AbstractSet,AbstractSet實作了equals和hashcode方法。

實作了NavigableSet接口,意味着它支援一系列的導航方法。比如查找與指定目标最比對項。

實作了Cloneable接口,意味着它能被克隆。

實作了java.io.Serializable接口,意味着它支援序列化。

(2)構造方法:

TreeSet() 
          構造一個新的空 set,該 set 根據其元素的自然順序進行排序。
TreeSet(Collection<? extends E> c) 
          構造一個包含指定 collection 元素的新 TreeSet,它按照其元素的自然順序進行排序。
TreeSet(Comparator<? super E> comparator) 
          構造一個新的空 TreeSet,它根據指定比較器進行排序。
TreeSet(SortedSet<E> s) 
          構造一個與指定有序 set 具有相同映射關系和相同排序的新 TreeSet。
           

(3)方法:

boolean    add(E e) 
          将指定的元素添加到此 set(如果該元素尚未存在于 set 中)。
 boolean    addAll(Collection<? extends E> c) 
          将指定 collection 中的所有元素添加到此 set 中。
 E  ceiling(E e) 
          傳回此 set 中大于等于給定元素的最小元素;如果不存在這樣的元素,則傳回 null。
 void   clear() 
          移除此 set 中的所有元素。
 Object clone() 
          傳回 TreeSet 執行個體的淺表副本。
 Comparator<? super E>  comparator() 
          傳回對此 set 中的元素進行排序的比較器;如果此 set 使用其元素的自然順序,則傳回 null。
 boolean    contains(Object o) 
          如果此 set 包含指定的元素,則傳回 true。
 Iterator<E>    descendingIterator() 
          傳回在此 set 元素上按降序進行疊代的疊代器。
 NavigableSet<E>    descendingSet() 
          傳回此 set 中所包含元素的逆序視圖。
 E  first() 
          傳回此 set 中目前第一個(最低)元素。
 E  floor(E e) 
          傳回此 set 中小于等于給定元素的最大元素;如果不存在這樣的元素,則傳回 null。
 SortedSet<E>   headSet(E toElement) 
          傳回此 set 的部分視圖,其元素嚴格小于 toElement。
 NavigableSet<E>    headSet(E toElement, boolean inclusive) 
          傳回此 set 的部分視圖,其元素小于(或等于,如果 inclusive 為 true)toElement。
 E  higher(E e) 
          傳回此 set 中嚴格大于給定元素的最小元素;如果不存在這樣的元素,則傳回 null。
 boolean    isEmpty() 
          如果此 set 不包含任何元素,則傳回 true。
 Iterator<E>    iterator() 
          傳回在此 set 中的元素上按升序進行疊代的疊代器。
 E  last() 
          傳回此 set 中目前最後一個(最高)元素。
 E  lower(E e) 
          傳回此 set 中嚴格小于給定元素的最大元素;如果不存在這樣的元素,則傳回 null。
 E  pollFirst() 
          擷取并移除第一個(最低)元素;如果此 set 為空,則傳回 null。
 E  pollLast() 
          擷取并移除最後一個(最高)元素;如果此 set 為空,則傳回 null。
 boolean    remove(Object o) 
          将指定的元素從 set 中移除(如果該元素存在于此 set 中)。
 int    size() 
          傳回 set 中的元素數(set 的容量)。
 NavigableSet<E>    subSet(E fromElement, boolean fromInclusive, E toElement, boolean toInclusive) 
          傳回此 set 的部分視圖,其元素範圍從 fromElement 到 toElement。
 SortedSet<E>   subSet(E fromElement, E toElement) 
          傳回此 set 的部分視圖,其元素從 fromElement(包括)到 toElement(不包括)。
 SortedSet<E>   tailSet(E fromElement) 
          傳回此 set 的部分視圖,其元素大于等于 fromElement。
 NavigableSet<E>    tailSet(E fromElement, boolean inclusive) 
          傳回此 set 的部分視圖,其元素大于(或等于,如果 inclusive 為 true)fromElement。
           

3.總結

(1)TreeSet中不允許使用null元素!在添加的時候如果添加null,則會抛出NullPointerException異常。

(2)TreeSet是基于TreeMap實作的。TreeSet中的元素支援2種排序方式:自然排序 或者 根據建立TreeSet 時提供的 Comparator 進行排序。這取決于使用的構造方法。

(3)TreeSet是非同步的方法。 它的iterator 方法傳回的疊代器是fail-fast的。

(4)TreeSet不支援快速随機周遊,隻能通過疊代器進行周遊!

例子:

a.使用Iterator順序周遊
for(Iterator iter = set.iterator(); iter.hasNext(); ) { 
    iter.next();
} 
           
b.使用foreach
Object[] object = (Object[])set.toArray();
for (Object obj : object)
    System.out.printf(obj);
           

四.源碼

對TreeSet和HashSet的源碼不再進行剖析,二者分别是基于TreeMap和HashMap實作的,隻是對應的節點中隻有key,而沒有value,是以對TreeMap和HashMap比較了解的話,對TreeSet和HashSet的了解就會非常容易。

五.總結對比(使用場景)

1.HashSet是一個無序的集合,基于HashMap實作;TreeSet是一個有序的集合,基于TreeMap實作。

2.HashSet集合中允許有null元素,TreeSet集合中不允許有null元素。

3.HashSet和TreeSet都是非同步!在使用Iterator進行疊代的時候要注意fail-fast。

java集合系列——java集合概述(一)

java集合系列——List集合之ArrayList介紹(二)

java集合系列——List集合之LinkedList介紹(三)

java集合系列——List集合之Vector介紹(四)

java集合系列——List集合之Stack介紹(五)

java集合系列——List集合總結(六)

java集合系列——Map介紹(七)

java集合系列——Map之HashMap介紹(八)

java集合系列——Map之TreeMap介紹(九)

java集合系列——Set之HashSet和TreeSet介紹(十)

如果帥氣(美麗)、睿智(聰穎),和我一樣簡單善良的你看到本篇博文中存在問題,請指出,我虛心接受你讓我成長的批評,謝謝閱讀!

祝你今天開心愉快!

歡迎通路我的csdn部落格,我們一同成長!

“不管做什麼,隻要堅持下去就會看到不一樣!在路上,不卑不亢!”

部落格首頁:http://blog.csdn.net/u010648555

繼續閱讀