1. 程式人生 > >java基礎知識---java集合類知識點解說

java基礎知識---java集合類知識點解說

  這篇文章主要是解說一下"我終於理解精通java的"精通"意思(一)"裡面我提到的相關java知識點,在上一篇文章中我一共面試他有如下的知識點:設計模式(一般指GOF23種設計模式),java常用集合類. 關於GOF23種設計模式一篇恐怕寫不完,暫且放在設計模式分類那邊去講解吧. 這裡先講解我們常用的java集合類以及他們的區別.

  我們軟體開發過程中常用的集合介面主要有以下幾個介面. Collection,List,Set,Map,Queue. 如下圖:

java集合相關類圖,看不清的請到我的相簿上看,下面講解一下這些類分別做什麼用,以及有什麼區別.

  我們先來看一下Collection介面,Collection介面有兩個子介面,分別是List和Set.Collection介面主要是一些新增,刪除,迭代,判斷是否為空,判斷是否包含某個元素,集合大小,清空,與其他集合的交集等操作. List主要特點是有序,也就是插入是什麼順序,取出來仍然是什麼順序,可以根據位置進行插入或刪除或取元素. Set的主要特點是無序的,且元素不能重複插入(判斷元是否重複是根據equals方法來決定.但帶有Hash的如HashSet等還得判斷hashcode是否相等),最多允許一個null元素.

  下面先介紹一下List介面下的類, ArrayList,LinkedList,Vector,Stack,ArrayList是用陣列實現的,LinkededList是採用連結串列實現的.Vector和ArrayList一樣是用陣列實現,只不過Vector是多執行緒安全的.Stack就沒什麼好說,就適配一下Stack其他和Vector一樣.陣列與連結串列大家在資料結構裡優缺點肯定知道,這裡不多講.

  再來看下Set,EnumSet主要是給列舉專用,HashSet與TreeSet,HashSet是基於HashMap來實現的,TreeSet是基於TreeMap來實現的,TreeSet與HashSet不同的是它是有序的.LinkedHashSet與HashSet又有什麼不同呢,其實就一點,就是LinkedHashSet順序是可預測的,元素的順序是你放入容器的順序.由於LinkHashSet是基於LinkHashMap實現的,同樣也說明HashMap與LinkedHashMap的區別也是因為LinkedHashMap的key值順序是可以預測的.HashMap與TreeMap的區別是TreeMap的key值是有序的.順序由你實現的或傳入的compare或comparator介面來決定.

  接下來講一下Map介面, Map介面是用來儲存鍵值對(那key,value).可以根據key獲取value. 關於HashMap,TreeMap,LinkedHashMap上面已經講過.現在主要講一下IdentityHashMap.IdentityHashMap中的key值是不允許重複的,這裡不允許重複不是用equals和hashcode來判斷,而是直接用"=="來判斷.WeakHashMap這個是個比較高階的話題,可能要開個話題專門講一下,現在我們先簡單介紹一下,我們知道java記憶體管理模型中有三種引用型別:強引用,軟體引用,弱引用. 從執行緒的根開始強引用所指向的物件是不能被垃圾收集器回收.軟體引用所指向的物件是當虛擬機器記憶體接近不夠用時會強制回收,弱引用所指的物件是垃圾收集器執行到時可以回收,如果沒有執行到仍然是存在記憶體裡.這裡的WeakHashMap存key和value時,他把key作為弱引用來實現.也就是當你用key去取值時,如果垃圾回收器還沒有執行回收操作,可以取到值,如果已經回收了,將會取到null.

  下面講一下Queue介面,ConcurrentLinkedQueue是一個標準的先進先出佇列實現,非執行緒安全,且不允許空元素.LinkedBlockingQueue與ArrayBlockingQueue,其中ArrayBlockingQueue必須指定佇列大小,並且不能再改變.而LinkedBlockingQueue指定大小是可選的,如果沒有設定就預設為Integer.MAX_VALUE,同樣指定後不能再改變,當佇列為空時,從佇列取值便會阻塞,當佇列滿時,要向佇列插入值時便會阻塞.PriorityQueue優先順序佇列關鍵取決定元元素實現的Comparable介面,或在構造時指定的Comparator介面.當構造時指這了Comparator,優先使用Comparator,而不用Comparable,來判斷優先順序.優先順序高的先出隊,當同樣兩個高優先順序相等時出隊是無序的.PriorityBlockingQueue的阻塞方式與LinkedBlockingQueue或ArrayBlockingQueue相同.又具備PriorityQueue的特點.DelayQueue佇列是按放入元素最先過期的元素取出來,如果取的時候還沒有過期的元素將返回null.SynchronousQueue這個佇列比較特殊,他不能放入任何元素直到有其他執行緒來取元素.同樣,不能取任何元素直到有其他執行緒放入元素.真正的在多執行緒環境中的先進先出.

  另外圖裡畫錯的有一個叫LinkedBlockingDeque,它是實現介面Deque,唯一不同的是Deque是雙向的佇列,就是可以在兩頭增加刪除元素. 能實現後進先出.其他沒有什麼區別.

  最後講一下包含Hash這個Hash(雜湊的原理),包含Hash的都是用雜湊方法來存放元素到容器當中,當判斷是否相等時,首先是是獲取物件的雜湊值來計算放在哪個雜湊桶.然後從桶裡所有元素裡取出來一個一個用equals來比較是否相等. 所以如果使用包含Hash的容器一定要注意,你重寫了equals也要重寫hascode. 不要認為equals相等就應該相等. 否則將得不到預期的結果.