java中的資料結構
前言
之前遇到一個問題,具體是說: 當我們用HashMap的時候,是怎樣考慮優化其效能的呢?當時就一臉懵逼,原來是因為hashmap的自動擴容影響了效能,後面查資料才知道,可以通過設定hashmap的合理的初始容量或者載入因子來優化。 工作了一段時間了,連這個都不知道表示很羞愧。然後就去查看了一些關於資料結構的知識。其實也常常聽說資料結構包括連結串列,佇列,棧,樹和二叉樹,圖等。但是在java中具體的應用有哪些呢?抱著一種好奇的心態去整列了一下java中的資料結構。
大概整理如下圖

大概結構圖
我在開發過程中用的最多的就屬hashmap和arrayList。樹和二叉樹看了很久還是不明所以,後面再逐步修改吧。
線性表
- linkedList 就是基於雙向連結串列的結構其插入,刪除,新增的效能強於arrayList。因為arrayList本質就是陣列,其需要的記憶體空間必須是連續的,所以當需要插入一條資料時,若在末端增加資料,其效能消耗也還好,但是若在任意位置插入就需移動資料的位置。linkedList 需要的記憶體空間可以不連續,插入資料時只需要改變節點的prev和next的指向就行了。
- linkedList 隨機訪問get和set就沒有arrayList快了。linkedList需要移動指標。
- 棧 先進後出,java中vector 是棧的應用,其執行緒安全,效能差。其實現類是stack類
- 佇列 先進先出,java中的Queue是和List一樣繼承於collection。上圖用連結串列實現佇列的方法是用C語言實現,佇列最常見的應用就是非同步訊息,日誌等,如Android中的handler的messageQueue。
hash表(散列表)
java中的Map。其中的實線類有 HashTable,HashMap,WeakHashMap.其中weakhashMap是一種對key 弱引用map。寫到這裡就想起了hashmap的原理以及hashmap與hashset的區別等,然後可以參看 ofollow,noindex">hashmap的原理
- hashTable 不允許null key和null value,執行緒安全,單執行緒操作效能差。 通過initial capacity和load factor兩個引數調整效能。通常預設的load factor 0.75較好地實現了時間和空間的均衡。增大load factor可以節省空間但相應的查詢時間將增大,這會影響像get和put這樣的操作。
- hashmap 允許null key和null value 但是是非同步的,所以執行緒不安全。將HashMap視為Collection時(values()方法可返回Collection),其迭代子操作時間開銷和HashMap的容量成比例。因此,如果迭代操作的效能相當重要的話,不要將HashMap的初始化容量設得過高,或者load factor過低。
樹和二叉樹
樹是一種非線性結構,二叉樹為度為2的樹形結構,分為左子樹和右子樹。
二叉樹概念以及儲存結構--51CTO- 葉結點(Leaf):度為0的結點;
- 路徑和路徑長度:從結點n1到nk的路徑為一個結點序列n1,n2,...,nk。ni是ni+1的父結點。路徑所包含邊的個數為路徑的長度;
- 結點的層次(Level):規定根結點在1層,其他任一結點的層數是其父結點的層數加1
- 樹的深度(Depth):樹中所有結點中的最大層次是這棵樹的深度;
圖
圖(Graph)是由頂點的有窮非空集合和頂點之間邊的集合組成,通常表示為:G(V,E),其中,G表示一個圖,V是圖G中頂點的集合,E是圖G中邊的集合。在圖中的資料元素,我們稱之為頂點(Vertex),頂點集合有窮非空。在圖中,任意兩個頂點之間都可能有關係,頂點之間的邏輯關係用邊來表示,邊集可以是空的。 圖的詳解
樹和圖都沒有接觸過,目前還不知道java中的應用。
嘗試整理文章,每天進步一丟丟,嘻嘻。