數組長度是固定的,沒法動態改變;集合容量是動態改變的;數組
數組能存儲基本數據類型;集合只能存儲對象;安全
數組在定義時須要指定容量,所以length只能獲取到數組的容量,並不能判斷數組中存儲了多少元素;
集合的size()能夠準確判斷集合中存儲了多少元素;框架
Java集合類主要由兩個根接口Collection和Map派生出來的,Collection派生出了三個子接口:List、Set、Queue(Java5新增的隊列),所以Java集合大體也可分紅List、Set、Queue、Map四種接口體系,(注意:Map不是Collection的子接口)。線程
有序可重複集合,可直接根據元素的索引來訪問。List集合默認按照元素的添加順序設置元素的索引,能夠經過索引(相似數組的下標)來訪問指定位置的集合元素。
實現List接口的集合主要有:ArrayList、LinkedList、Vector、Stack。指針
底層經過數組實現,初始容量爲10,在每次向容器中增長元素的同時都會進行容量檢查,當快溢出時,就會進行擴容操做;
查詢快,增刪慢,輕量級;
線程不安全。對象
底層是一種雙向循環鏈表。在此鏈表上每個數據節點都由三部分組成:前指針(指向前面的節點的位置),數據,後指針(指向後面的節點的位置);
最後一個節點的後指針指向第一個節點的前指針,造成一個循環。
查詢效率低、增刪效率高;
它具備方法addFirst()、addLast()、getFirst()、getLast()、removeFirst()、removeLast()等。blog
隊列(Queue)是限定全部的插入只能在表的一端進行,而全部的刪除都在表的另外一端進行的線性表。
表中容許插入的一端稱爲隊尾(Rear),容許刪除的一端稱爲隊頭(Front)。
隊列的操做是按先進先出(FIFO)的原則進行的。
隊列的物理存儲能夠用順序存儲結構,也能夠用鏈式存儲結構。排序
棧(Stack)也是一種特殊的線性表,是一種後進先出(LIFO)的結構。
棧是限定僅在表尾進行插入和刪除運算的線性表,表尾稱爲棧頂(top),表頭稱爲棧底(bottom)。
棧的物理存儲能夠用順序存儲結構,也能夠用鏈式存儲結構。索引
Vector與ArrayList相似,可是是線程安全的。接口
無序不可重複集合,只能根據元素自己來訪問;
容許存放null;
HashSet底層經過HashMap實現,只不過生成一個HashSet的話,系統只提供key的訪問; 若是有兩個Key重複,那麼會覆蓋以前的;
非線程安全。
LinkedHashSet是HashSet的一個子類,它用一個鏈表來維護元素的插入順序,插入的時候即要計算hashCode又要維護鏈表,而遍歷的時候只須要按鏈表來訪問元素。
TreeSet實現了SortedSet接口,顧名思義這是一種排序的Set集合;
TreeSet是依靠TreeMap來實現的;
TreeSet提供了一些額外的按排序位置訪問元素的方法,例如first(), last(), lower(), higher(), subSet(), headSet(), tailSet();
TreeSet的排序分兩種類型,一種是天然排序,另外一種是定製排序。
存儲key-value對的集合,可根據元素的key來訪問value;
key惟一;