是的,這篇blogs是一個總結篇,最開始的時候我提到過,對於java容器或集合的學習也能夠看作是對數據結構的學習與應用。在前面咱們分析了不少的java容器,也接觸了好多種經常使用的數據結構,今天咱們就來總結下這些內容。
下面咱們以數據結構的維度來總結下,在Java集合的實現過程當中,底層到底使用了哪些經常使用的數據結構中,他們分別又有什麼特色。
1. 數組(Array)
結構說明:在程序設計中,爲了處理方便, 把具備相同類型的若干變量按有序的形式組織起來。這些按序排列的同類數據元素的集合稱爲數組。
結構特色:能夠隨機訪問,插入和刪除效率低、內存固定。
Java集合:ArrayList、Vector
2. 鏈表(Linked List)
結構說明:是一種物理存儲單元上非連續、非順序的存儲結構,數據元素的邏輯順序是經過鏈表中的指針連接次序實現的。
結構特色:插入和刪除效率高、查找效率低。
Java集合:LinkedList、LinkedHashMap(鏈表+哈希表)、LinkedHashSet(鏈表+哈希表)
3. 哈希表(Hash)
結構說明:若結構中存在關鍵字和K相等的記錄,則一定在f(K)的存儲位置上。由此,不需比較即可直接取得所查記錄。稱這個對應關係f爲散列函數(Hash function),按這個思想創建的表爲散列表。
結構特色:查找效率高,插入和刪除較快,內存固定,存在散列衝突。
Java集合:HashMap、HashSet、HashTable、LinkedHashMap(鏈表+哈希表)、LinkedHashSet(鏈表+哈希表)
4. 堆(Heap)
結構說明:在計算機科學中,堆是一種特殊的樹形數據結構,每一個結點都有一個值。一般咱們所說的堆的數據結構,是指二叉堆。堆的特色是根結點的值最小(或最大),且根結點的兩個子樹也是一個堆。
結構特色:插入、刪除較快,對最大項、最小項存取快,其餘項存取較慢。
Java集合:PriorityQueue(二叉堆實現的優先隊列)
5. 棧(Stack)
結構說明:只能在某一端插入和刪除的特殊線性表。它按照後進先出的原則存儲數據,先進入的數據被壓入棧底,最後的數據在棧頂,須要讀數據的時候從棧頂開始彈出數據。
結構特色:先進後出(First In Last Out)。
Java集合:Stack
6. 隊列(Queue)
結構說明:一種特殊的線性表,它只容許在表的前端(front)進行刪除操做,而在表的後端(rear)進行插入操做。
結構特色:先進先出(First In First Out)。
Java集合:ArrayDeque(雙端隊列)、LinkedList(雙端隊列)
7. 樹(Tree)
結構說明:它是由n(n>=1)個有限節點組成一個具備層次關係的集合。
(1)每一個元素稱爲結點(node)。
(2)有一個特定的結點被稱爲根結點或樹根(root)。
(3)除根結點以外的其他數據元素被分爲m(m≥0)個互不相交的集合T1,T2,……Tm-1,其中每個集合Ti(1<=i<=m)自己也是一棵樹,被稱做原樹的子樹(subtree)。
結構特色:查詢、插入、刪除都比較快,可是算法複雜。
Java集合:TreeMap(紅黑樹)、TreeSet(紅黑樹)
上面咱們就總結了下經常使用數據結構與Java集合的關係(固然經常使用數據結構還有"圖",這裏不作介紹了),並簡單介紹了下每種數據結構的概念與特色。知道了這些概念性理論後,對於咱們使用Java集合的時候能夠給出必定的選擇指導,今後之後不再會一味地new ArrayList()和new HashMap()了,在使用前咱們會盡量的想咱們使用集合的目的,使用過程當中是插入和刪除多仍是查詢比較多,是否須要作排序等等。
另外經過總結會發現一個祕密,固然你也許早就發現了,那就是用全部的數據結構均可以用數組和鏈表來實現,相對應的ArrayList和LinkedList也能夠做爲任何一種數據結構的基礎來使用。
學習理論不是目的,總結概念也不是目標,咱們的口號是沒有蛀牙!額~是學以至用,用理論指導實踐,紙上得來終覺淺絕知此事要躬行,學而時習之不亦樂乎......