程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> JAVA綜合教程 >> HashSet HashTable 與 TreeSet,hashsettreeset

HashSet HashTable 與 TreeSet,hashsettreeset

編輯:JAVA綜合教程

HashSet HashTable 與 TreeSet,hashsettreeset


HashSet<T>類

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

HashSet<T>的一些特性如下:

1、HashSet<T>中的值不能重復且沒有順序。

2、HashSet<T>的容量會按需自動添加。

構造方法:

HashSet() 默認相等比較器創建一個空的新實例。

HashSet(IEnumerable<T> collection)  把指定集合中的collection中的數據復制到集中

HashSet(IEqualityComparer<T> comparer)  使用指定的相等比較器創建一個空的新實例

HashSet(IEnumerable<T> collection,IEqualityComparer<T> comparer)  使用指定的比較器實例化數據,且將指定集合中的元素復制到集合中。

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

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

成員        類型        說明

Add        方法        將指定的元素添加到集合中

Clear        方法         清空集合中的所有元素

Contains        方法         確定某元素是否在HashSet<T>中

Exists        方法         確定HashSet<T>是否包含於指定條件相匹配的元素

ExceptWith    方法         從當前HashSet<T>移除指定集合中的所有元素

IntersectWith     方法        修改當前的HashSet<T>對象,以僅包含該對象和指定集合中存在的元素

IsProperSubsetOf  方法        確定HashSet<T>對象是否為指定集合的真子集

IsProperSupersetOf 方法        確定HashSet<T>對象是否為指定集合的真超集

IsSunsetOf     方法         確定HashSet<T>對象是否為指定集合的子集

IsSupersetOf    方法         確定HashSet<T>對象是否為指定集合的超集

Remove      方法         從HashSet<T>對象中移除指定的元素

RemoveWhere    方法         從HashSet<T>集合中移除與指定謂詞所定義的條件相匹配的所有元素

SetEquals     方法         確定HashSet<T>對象與指定的集合中是否包含相同的元素

SynmmetricExceptWith  方法     修改當前的HashSet<T>對象,以僅包含該對象或指定集合中存在的元素

TrimExcess    方法         將HashSet<T>對象的容量設置為它所包含的元素的實際個數,向上捨入為接近的特性與實現的值。

UnionWith     方法         修改當前的HashSet<T>對象,以包含該對象本身和指定集合中存在的所有元素

 

 

TreeSet

 

TreeSet是依靠TreeMap來實現的。
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()方法來區別這兩種情況。

 

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved