[toc] 集合 集合與數組 數組 (可以存儲基本數據類型)是用來存現對象的一種容器,但是數組的長度固定,不適合在對象數量未知的情況下使用。 集合 (只能存儲對象,對象類型可以不一樣)的長度可變,可在多數情況下使用。 註:數組我在前面的博客講了大家可以看下 集合中介面和類的關係 Collection ...
[toc] # 集合 # ## 集合與數組 ## **數組**(可以存儲基本數據類型)是用來存現對象的一種容器,但是數組的長度固定,不適合在對象數量未知的情況下使用。 **集合**(只能存儲對象,對象類型可以不一樣)的長度可變,可在多數情況下使用。 註:數組我在前面的博客講了大家可以看下 ## 集合中介面和類的關係 ## **Collection**介面是集合類的根介面,Java中沒有提供這個介面的直接的實現類。但是卻讓其被繼承產生了兩個介面,就是Set和List。Set中不能包含重覆的元素。List是一個有序的集合,可以包含重覆的元素,提供了按索引訪問的方式。 **Map**是Java.util包中的另一個介面,它和Collection介面沒有關係,是相互獨立的,但是都屬於集合類的一部分。Map包含了key-value對。Map不能包含重覆的key,但是可以包含相同的value。 **Iterator**所有的集合類,都實現了Iterator介面,這是一個用於遍歷集合中元素的介面,主要包含以下三種方法: 1.**hasNext()**是否還有下一個元素。 2.**next()**返回下一個元素。 3.**remove()**刪除當前元素。 ### 層次圖 ### 圖一這個比較簡單 ![這裡寫圖片描述](http://img.blog.csdn.net/20170905084526091?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvTGl2ZW9yX0RpZQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) 圖二完整 ![這裡寫圖片描述](http://img.blog.csdn.net/20170905084554470?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvTGl2ZW9yX0RpZQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) ### list,set,map對比 ### | 介面 | 子介面 | 是否有序|是否允許元素重覆| |------------|-------------|----------|--------------| |Collection | |否| |List |ArrayList |否|是| | |LinkedList |否|是| | |Vector |否|是| |Set|AbstractSet |否|否| | |HashSet |否|否| | |TreeSet |是(用二叉排序樹)|否| |Map|AbstractMap |否|使用key-value來映射和存儲數據,key必須唯一,value可以重覆 | |HashMap||否|使用key-value來映射和存儲數據,key必須唯一,value可以重覆 | |TreeMap|是(用二叉排序樹)|使用key-value來映射和存儲數據,key必須唯一,value可以重覆 ## list(有序、可重覆) ## List里存放的對象是有序的,同時也是可以重覆的,List關註的是索引,擁有一系列和索引相關的方法,查詢速度快。因為往list集合里插入或刪除數據時,會伴隨著後面數據的移動,所有插入刪除數據速度慢。 ### ArrayList ### ArrayList是基於數組的,在初始化ArrayList時,會構建空數組(Object[] elementData={})。ArrayList是一個無序的,它是按照添加的先後順序排列,當然,他也提供了sort方法,如果需要對ArrayList進行排序,只需要調用這個方法,提供Comparator比較器即可 #### add操作: #### 1)如果是第一次添加元素,數組的長度被擴容到預設的capacity,也就是10. 2) 當發覺同時添加一個或者是多個元素,數組長度不夠時,就擴容,這裡有兩種情況: 只添加一個元素,例如:原來數組的capacity為10,size已經為10,不能再添加了。需要擴容,新的capacity=old capacity+old capacity>>1=10+10/2=15.即新的容量為15。 當同時添加多個元素時,原來數組的capacity為10,size為10,當同時添加6個元素時。它需要的min capacity為16,而按照capacity=old capacity+old capacity>>1=10+10/2=15。new capacity小於min capacity,則取min capacity。 對於添加,如果不指定下標,就直接添加到數組後面,不涉及元素的移動,如果要添加到某個特定的位置,那需要將這個位置開始的元素往後挪一個位置,然後再對這個位置設置。 #### Remove操作: #### Remove提供兩種,按照下標和value。 1)**remove(int index)**:首先需要檢查Index是否在合理的範圍內。其次再調用System.arraycopy將index之後的元素向前移動。 2)**remove(Object o)**:首先遍曆數組,獲取第一個相同的元素,獲取該元素的下標。其次再調用System.arraycopy將index之後的元素向前移動。 #### Get操作: #### 這個比較簡單,直接對數組進行操作即可。 ### LinkedList ### LinkedList是基於鏈表的,它是一個雙向鏈表,每個節點維護了一個prev和next指針。同時對於這個鏈表,維護了first和last指針,first指向第一個元素,last指向最後一個元素。LinkedList是一個無序的鏈表,按照插入的先後順序排序,不提供sort方法對內部元素排序。 #### Add元素: #### LinkedList提供了幾個添加元素的方法:addFirst、addLast、addAll、add等,時間複雜度為O(1)。 #### Remove元素: #### LinkedList提供了幾個移除元素的方法:removeFirst、removeLast、removeFirstOccurrence、remove等,時間複雜度為O(1)。 #### Get元素: #### 根據給定的下標index,判斷它first節點、last直接距離,如果index