首頁  >  文章  >  类库下载  >  哈希集 HashTable 與 TreeSet

哈希集 HashTable 與 TreeSet

高洛峰
高洛峰原創
2016-11-01 15:01:121778瀏覽

HashSet

HashSet類主要是設計用來做高效能集運算的,例如對兩個集合求交集、並集、差集等。集合中包含一組不重複出現且無特性順序的元素。

HashSet的一些特性如下:

1、HashSet中的值不能重複且沒有順序。

2、HashSet的容量會依需求自動添加。

構造方法:

HashSet() 預設相等比較器建立一個空的新實例。

HashSet(IEnumerable collection)  把指定集合中的collection中的資料複製到集中

HashSet(IEqualityComparer comparer)〜〕使用指定的相等性比較器來建立一個空的比較

comparer)  使用指定的比較器實例化數據,並將指定集合中的元素複製到集合中。

因為HashSet是專門設計來做集合運算的,因此它提供的方法中有不少是和集合運算相關的。

以下給出它的一些常用方法介紹

成員類型說明

Add        方法將指定的元素添加到集合中       法確定某元素是否在HashSet

Exists        方法確定HashSet

是否包含於指定條件相匹配的元素

ExceptWith 『  方法可從目前的修改/現有元素修改

對象,以僅包含該對象和指定集合中存在的元素

IsProperSubsetOf  方法確定HashSet

物件是否為指定集合的​​真子集

IsProperSupersetOf 方法判斷HashSet

物件是否為指定集合的​​真 集子是否為指定集合的​​直〜〜㟀集

IsSupersetOf    方法確定HashSet

物件是否為指定集合的​​超集

Remove      方法從HashSet

物件中從指定的元素中移除」設定。詞所定義的條件相符的所有元素

SetEquals     方法決定HashSet

物件與指定的集合中是否包含相同的元素

SynmmetricExceptWith  」物件中是否包含相同的元素

SynmmetricExceptWith  」物件中是否包含相同的元素

SynmmetricExceptWith  〜〜pashSet〔中存在的元素」 方法將HashSet

物件的容量設定為它所包含的元素的實際個數,向上捨入為接近的特性與實現的值。

UnionWith     方法           方法         修改當前的HashSet

對象,以包含該對象本身和指定集合中存在的所有元素

🎎 Map來實現的。 TreeSet是一個有序集合,TreeSet中的元素會依照升序排列,預設是依照自然排序進行排列,意味著TreeSet中的元素要實作Comparable介面。或有一個自訂的比較器。

我們可以在建構TreeSet物件時,傳遞實作Comparator介面的比較器物件。

 

TreeSet與HashSet的區別

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.compareTo()方法,這就要求key必須實作Comparable介面.

c. TreeMap是使用Tree資料結構實現的,所以使用compare介面就可以完成定位了.

 

HashTable

Hashtables(雜湊表)在電腦領域中已不 是新概念了。它們是用來加快電腦的處理速度的,用當今的標準來處理,速度非常慢,而它們可以讓你在查詢許多資料條目時,很快地找到一個特殊的條目。 儘管現代的機器速度已快了幾千倍,但是為了得到應用程式的最佳效能,hashtables仍然是個很有用的方法。

 

Hashtable和HashMap物件可以讓你把一個key和一個value結合起來,並用put() 方法把這對key/value輸入到表中。然後你可以透過呼叫get()方法,把key當作參數來得到這個value(值)。只要滿足兩個基本的要求, key和value可以是任何物件。注意,因為key和value必須是對象,所以原始型別(primitive types)必須運用諸如Integer(int)的方法轉換成物件。

 

為了將一個特定類別的物件用來做一個key,這個類別必須提供兩個方法,equals() 和 hashCode()。這兩個方法在java.lang.Object中,所以所有的類別都可以繼承這兩個方法;但是,這兩個方法在Object類別中的實作一般沒什麼用,所以你通常需要自己重載這兩個方法。

 

Equals ()方法把它的物件同另一個物件進行比較,如果這兩個物件代表相同的訊息,則傳回true。該方法也查看並確保這兩個物件屬於相同的類別。如果兩個參考對象 是完全一樣的對象,Object.equals()會傳回true,這就說明了為什麼這個方法通常不是很適合的原因。在大多數情況下,你需要一個方法來一個 字段一個字段地進行比較,所以我們認為代表相同數據的不同對像是相等的。

 

HashCode()方法透過運用物件的內容執行一個雜湊函數來產生一個int值。 Hashtable和HashMap用這個值來算出一對key/value位於哪個bucket(雜湊元)(或列表)中。 Hashtable效能
影響hashtable功效的主要因素就是表中列表的平均長度,因為平均搜尋時間與這個平均長度直接相關。很顯然, 要減小平均長度,你必須增加hashtable中列表的數量;如果列表數量非常大,以至於大多數列表或所有列表只包含一條記錄,你就會獲得最佳的搜索效 率。然而,這樣做可能太過分了。如果你的hashtable的列表數遠遠多於資料條目,那你就沒有必要做這樣的記憶體花費了,而在某些情況下,人們也不可能 接受這樣的做法。

ashtable和HashMap
Hashtable和HashMap類別有三個重要的差異。第一個不同主要是歷史原因。 Hashtable是基於陳舊的Dictionary類別的,HashMap是Java 1.2引進的Map介面的實作。

也許最重要的不同是Hashtable的方法是同步的,而HashMap的方法不是。這意味著,雖然你可以不用採取任何特殊的行為就可以在一個多 線程的應用程式中用一個Hashtable,但你必須同樣地為一個HashMap提供外同步。一個方便的方法就是利用Collections類別的靜態的 synchronizedMap()方法,它創建一個線程安全的Map對象,並把它作為一個封裝的對象來返回。這個物件的方法可以讓你同步存取潛在的HashMap。這麼做的結果就是當你不需要同步時,你不能切斷Hashtable中的同步(例如在一個單執行緒的應用程式中),而且同步增加了很多處理費用。

第三點不同是,只有HashMap可以讓你將空值作為一個表的條目的key或value。 HashMap中只有一筆記錄可以是空的key,但任 意數量的條目可以是空的value。這就是說,如果在表中沒有發現搜尋鍵,或者如果發現了搜尋鍵,但它是一個空的值,那麼get()將傳回null。如果 有必要,用containKey()方法來區別這兩種情況。


陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn