集合

1、數組和集合的區別

  • 數組長度是固定的,沒法動態改變;集合容量是動態改變的;數組

  • 數組能存儲基本數據類型;集合只能存儲對象;安全

  • 數組在定義時須要指定容量,所以length只能獲取到數組的容量,並不能判斷數組中存儲了多少元素;
    集合的size()能夠準確判斷集合中存儲了多少元素;框架

2、集合框架圖

  Java集合類主要由兩個根接口Collection和Map派生出來的,Collection派生出了三個子接口:List、Set、Queue(Java5新增的隊列),所以Java集合大體也可分紅List、Set、Queue、Map四種接口體系,(注意:Map不是Collection的子接口)。線程

3、List

有序可重複集合,可直接根據元素的索引來訪問。List集合默認按照元素的添加順序設置元素的索引,能夠經過索引(相似數組的下標)來訪問指定位置的集合元素。
實現List接口的集合主要有:ArrayList、LinkedList、Vector、Stack。指針

3.1 ArrayList

底層經過數組實現,初始容量爲10,在每次向容器中增長元素的同時都會進行容量檢查,當快溢出時,就會進行擴容操做;
查詢快,增刪慢,輕量級;
線程不安全。對象

3.2 LinkedList

底層是一種雙向循環鏈表。在此鏈表上每個數據節點都由三部分組成:前指針(指向前面的節點的位置),數據,後指針(指向後面的節點的位置);
最後一個節點的後指針指向第一個節點的前指針,造成一個循環。
查詢效率低、增刪效率高;
它具備方法addFirst()、addLast()、getFirst()、getLast()、removeFirst()、removeLast()等。blog

3.2.1 用LinkedList實現隊列:

隊列(Queue)是限定全部的插入只能在表的一端進行,而全部的刪除都在表的另外一端進行的線性表。
表中容許插入的一端稱爲隊尾(Rear),容許刪除的一端稱爲隊頭(Front)。
隊列的操做是按先進先出(FIFO)的原則進行的。
隊列的物理存儲能夠用順序存儲結構,也能夠用鏈式存儲結構。排序

3.2.2 用LinkedList實現棧:

棧(Stack)也是一種特殊的線性表,是一種後進先出(LIFO)的結構。
棧是限定僅在表尾進行插入和刪除運算的線性表,表尾稱爲棧頂(top),表頭稱爲棧底(bottom)。
棧的物理存儲能夠用順序存儲結構,也能夠用鏈式存儲結構。索引

4、Vector

Vector與ArrayList相似,可是是線程安全的。接口

5、Set

無序不可重複集合,只能根據元素自己來訪問;
容許存放null;

5.1 HashSet

HashSet底層經過HashMap實現,只不過生成一個HashSet的話,系統只提供key的訪問; 若是有兩個Key重複,那麼會覆蓋以前的;
非線程安全。

5.2 LinkedHashSet

LinkedHashSet是HashSet的一個子類,它用一個鏈表來維護元素的插入順序,插入的時候即要計算hashCode又要維護鏈表,而遍歷的時候只須要按鏈表來訪問元素。

5.3 TreeSet

TreeSet實現了SortedSet接口,顧名思義這是一種排序的Set集合;
TreeSet是依靠TreeMap來實現的;
TreeSet提供了一些額外的按排序位置訪問元素的方法,例如first(), last(), lower(), higher(), subSet(), headSet(), tailSet();
TreeSet的排序分兩種類型,一種是天然排序,另外一種是定製排序。

6、Map

存儲key-value對的集合,可根據元素的key來訪問value;
key惟一;

  • HashMap:鍵值對,key不能重複,可是value能夠重複;key的實現就是HashSet;value對應着放;容許null的鍵或值;線程不安全;
  • Hashtable:線程安全的,不容許null的鍵或值;
  • Properties::key和value都是String類型,用來讀配置文件;
  • TreeMap:對key排好序的Map; key就是TreeSet, value對應每一個key; key要實現Comparable接口或TreeMap有本身的構造器;
  • LinkedHashMap: 此實現與HashMap的不一樣之處在於,後者維護着一個運行於全部條目的雙重連接列表。存儲的數據是有序的。
相關文章
相關標籤/搜索