1. 程式人生 > >HashSet、TreeSet與HashMap

HashSet、TreeSet與HashMap

HashSet:

  HashSet實現了Set介面,它不允許集合中出現重複元素。當我們提到HashSet時,第一件事就是在將物件儲存在

HashSet之前,要確保重寫hashCode()方法和equals()方法,這樣才能比較物件的值是否相等,確保集合中沒有

儲存相同的物件。如果不重寫上述兩個方法,那麼將使用下面方法預設實現:

 public boolean add(Object obj)方法用在Set新增元素時,如果元素值重複時返回 "false",如果新增成功則返回"true"

  1. 沒有重複元素
  2. 可以高效的新增、刪除元素、判斷元素是否存在,效率都為O(1)
  3. 沒有順序
  4.   HashSet 是雜湊表實現的,可以放入null,但只能放入一個null

 

TreeSet:

        TreeSet 是二差樹實現的,Treeset中的資料是自動排好序的,不允許放入null值 

      適用場景分析:HashSet是基於Hash演算法實現的,其效能通常都優於TreeSet。我們通常都應該使用HashSet,在我們需要排序的功能時,我們才使用TreeSet。

 

HashMap:

  HashMap實現了Map介面,Map介面對鍵值對進行對映。Map中不允許出現重複的鍵(Key)。Map介面有兩個基本的實現

TreeMap和HashMap。TreeMap儲存了物件的排列次序,而HashMap不能。HashMap可以有空的鍵值對(Key(null)-Value(null))

HashMap是非執行緒安全的(非Synchronize),要想實現執行緒安全,那麼需要呼叫collections類的靜態方法synchronizeMap()實現。

public Object put(Object Key,Object value)方法用來將元素新增到map中。

擁有特定容量和載入因子,可以在新建變數時定義,比如:

HashSet<Integer> subScrips = new HashSet<>(50,1.0f)  第一個為載入容量,第二個為載入因子

名詞解釋:

初始容量 :是雜湊表在建立時的容量。

載入因子 :是雜湊表在其容量自動增加之前可以達到多滿的一種尺度。

當雜湊表中的條目數超出了載入因子與當前容量的乘積時,通過呼叫 rehash 方法將容量翻倍。

比如說向水桶中裝水,此時HashMap就是一個桶, 這個桶的容量就是載入容量,而載入因子就是你要控制向這個桶中倒的水不超過水桶容量的比例,比如載入因子是0.75 ,那麼在裝水的時候這個桶最多能裝到3/4 處(0.75即為3/4),超過這個比例時,桶會自動擴容。因此,這個桶最多能裝水 = 桶的容量 * 載入因子。

如果桶的容量是40,載入因子是0.75 那麼你的桶最多能裝40*0.75 = 30的水,如果你裝了30的水還想繼續裝水,那麼就該用大一點的桶,呼叫rehash就是負責增加桶的容量的方法。

摘抄原文地址:
原文:https://blog.csdn.net/injurooioo/article/details/49492443 
 

這裡有一個比較有趣的地方:

首先要知道hashset的初始容量為16,初始因子為0.75,當hashset的容量達到能夠裝的最大容量時就會進行再雜湊(rehash)操作,即呼叫rehash()方法,也就是擴容,會將容量進行翻倍,也就是16 32 64那麼分別用這幾個數來乘以初始因子即0.75得到 12 24 48也就是說在12 24 48這幾個容量的位置都會呼叫rehash方法,有趣的地方來了,本來hashset是無序的,但是當容量超過48的時候就全部變成了有序,測試結果如圖:

 各位可以自行測試。

 

使用場景:

hashmap:適用於在Map中插入、刪除和定位元素。 
treemap:適用於按自然順序或自定義順序遍歷鍵(key)。

 

HashSet和HashMap的區別:

HashSet                                                                     HashMap

實現Set介面                                                               實現Map介面

儲存物件                                                                    儲存鍵值對

呼叫add向set中新增方法                                           呼叫put向map中新增方法