1. 程式人生 > >HashSet、HashMap、ArrayList、LinkedList、Vector區別

HashSet、HashMap、ArrayList、LinkedList、Vector區別

什麼是HashSet

HashSet實現了Set介面,它不允許集合中有重複的值,當我們提到HashSet時,第一件事情就是在將物件儲存在HashSet之前,要先確保物件重寫equals()和hashCode()方法,這樣才能比較物件的值是否相等,以確保set中沒有儲存相等的物件。如果我們沒有重寫這兩個方法,將會使用這個方法的預設實現。

public boolean add(Object o)方法用來在Set中新增元素,當元素值重複時則會立即返回false,如果成功新增的話會返回true。

List 以特定次序來持有元素,可有重複元素

Set  無法擁有重複元素,內部排序

Map Map中不允許重複的鍵,value可多值。

HashSet、HashMap、ArrayList、LinkedList、Vector這幾個在Java程式設計中經常用到,他們之間有很多聯絡,有很多相通的地方、但也有很多不同。首先java集合類主要由兩個介面:Collection和Map。Collection又有子介面:Set、Queue、List.(這些基礎的介面關係這裡不多說了)

     HashSet與HashMap,名字很接近,都帶有Hash,也就是說他們都依賴Hash演算法來儲存。我們知道每個物件都有自己的Hash值,這個hash值可以由程式設計員來編寫函式來計算得出,但是要與equal函式相協調(這裡涉及到設計類時遵循的原則問題,有興趣的可以查閱相關資料,hash函式的編寫規則)。

    那麼HashSet與HashMap之間有什麼聯絡呢?HashSet底層使用HashMap來儲存的!大家可以看一下jdk的原始碼,會發現HashSet類原始碼中有一個HashMap型別的成員變數,其中的成員方法也是呼叫hashMap的成員方法,只不過儲存時,按照key-value對存入HashMap物件中,把值存在key中,Value統一為null。

   那麼ArrayList與LinkedList有什麼聯絡和區別呢?聯絡就是他們都實現List介面,因此有許多用法是一樣的;區別就要從底層分析了,ArrayList底層使用陣列儲存,LinkedList底層使用雙向連結串列儲存。列表中的每個節點都包含了對前一個和後一個元素的引用。學過資料結構的都知道,陣列與連結串列作為線性表各有優劣,所以ArrayList和LinkedList在效率和使用場景上也有區別。ArrayList在訪問資料時效率較高,在插入和刪除資料時效率較低。總體上來看ArrayList的效率要略高於LinkedList,因此大多數場景選擇Arraylist,除非很多時候要進行插入和刪除資料,這時再選擇LinkedList。

  ArrayList與vector呢?可以說這兩個相似度90%,只有一點區別,就是vector是一種執行緒安全類,它的方法都帶有Synchronized關鍵字。但是vector類很古老,很多方法名都比較長且比較難懂,因此基本不用vector類,但是當遇到多執行緒情況怎麼辦呢?不用怕,java提供了Collections工具類,能夠將ArrayList轉換成執行緒安全的類!

什麼是HashMap

HashMap實現了Map介面,Map介面對鍵值對進行對映。Map中不允許重複的鍵。Map介面有兩個基本的實現,HashMap和TreeMap。TreeMap儲存了物件的排列次序,而HashMap則不能。HashMap允許鍵和值為null。HashMap是非synchronized的。

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

那麼hashMap的工作原理是什麼?

當系統開始初始化HashMap的時候,系統會建立一個長度為capacity的Entry陣列。這個陣列儲存的元素是一個系列元素的索引,也稱為“桶”,當一個元素要增加的時候,會計算他的hashcode,然後再陣列中尋找他的位置,比如,他的位置有元素佔據了,那麼會在該元素上,擴展出一條索引鏈,將資料插入到這個索引鏈上。

HashSet和HashMap的區別

*HashMap*    *HashSet*
HashMap實現了Map介面    HashSet實現了Set介面
HashMap儲存鍵值對    HashSet僅僅儲存物件
使用put()方法將元素放入map中    使用add()方法將元素放入set中
HashMap中使用鍵物件來計算hashcode值    HashSet使用成員物件來計算hashcode值,對於兩個物件來說hashcode可能相同,所以equals()方法用來判斷物件的相等性,如果兩個物件不同的話,那麼返回false
HashMap比較快,因為是使用唯一的鍵來獲取物件    HashSet與Hashmap 存取速度基本一致,HashSet把HashMap進行了封裝