Java中Hashset、HashMap、ArrayList、LinkedList、Vector之間的聯繫與區別

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轉換成線程安全的類!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章