元素有放入順序,元素可重複。html
JDK8源碼中,初始長度是10,每次數組擴展都增長1/2左右。即:前端
private void grow(int minCapacity) { //minCapacity爲size+1,每次add元素都要檢查 int oldCapacity = elementData.length; //擴展前數組的容量 int newCapacity = oldCapacity + (oldCapacity >> 1); //擴展後數組的容量約爲原容量1.5倍 if (newCapacity - minCapacity < 0) newCapacity = minCapacity; elementData = Arrays.copyOf(elementData, newCapacity); }
能夠經過下標來訪問或者修改元素,對下標訪問的set和get時間複雜度爲O(1);java
一樣基於數組實現,會在內存中開闢一塊連續的空間來存儲。ArrayList是非線程安全的,效率高;Vector是基於線程安全的,但效率低,而且是方法級別的同步,不是絕對的線程安全。
初始容量10,每次數組擴展到原來容量的2倍(每次擴充的容量大小是能夠設置的,而ArrayList類不支持設定)。算法
每個元素存儲自己數據的同時還存儲上、下兩個元素的地址(雙向鏈表)。編程
棧,在計算機中運用普遍,好比說JVM,它就是基於棧來執行指令的。棧是限制插入和刪除只能在一個位置上進行的表,該位置是表的末端,叫做棧頂,對棧的基本操做有push(進棧)和pop(出棧),前者至關於插入,後者至關於刪除最後一個元素。棧有時又叫做LIFO(Last In First Out)表,即後進先出。
數組
棧通常有兩種實現,全部操做時間複雜度O(1):安全
對於隊列來講,元素只能從隊列尾插入,從隊列頭訪問和刪除。普通的隊列是一種先進先出(First In First Out,FIFO)的數據結構,而優先隊列中,元素都被賦予優先級。當訪問元素的時候,具備最高優先級的元素最早被刪除。
隊列也是表,通常有兩種實現,全部操做時間複雜度O(1)(優先隊列是經過大頂堆或者小頂堆實現):數據結構
元素無放入順序,元素不可重複(注意:元素雖然無放入順序,可是元素在set中的位置是由該元素的HashCode決定的,其位置實際上是固定的)
Set接口有兩個實現類:HashSet和LinkedHashSet多線程
SortedSet接口有一個實現類:TreeSet 底層是經過 TreeMap來實現的(如同HashSet底層是是經過HashMap來實現的同樣),所以兩者的實現方式幾乎徹底同樣。併發
元素按鍵值對存儲,通常無放入順序,其中值能夠重複,但鍵是惟一的,不能重複。Map接口有三個實現類:HashMap,Hashtable,LinkeHashMap
16*0.75=12
個數據,減小衝突),增長方式:通常old*2
,因爲容許設置初始容量,同時要保證容量增長後要是2的指數,因此容量增長比較複雜,詳細看 http://www.cnblogs.com/xzwblog/p/7289952.html#_label2_0;old*2+1
;HashMap和Hashtable的hash值計算方式也不相同
HashMap的hash計算參考 http://www.cnblogs.com/xzwblog/p/7289952.html#_label2_0 ,速度更快。
Hashtable是直接使用對象的hashCode,而且計算在hash表中的索引時直接使用%,以下代碼:
int hash = key.hashCode(); int index = (hash & 0x7FFFFFFF) % tab.length;
而且在高併發環境下,徹底能夠用ConcurrentHashMap來代替Hashtable。
還有一點不一樣:HashMap去掉了Hashtable 的contains方法,可是加上了containsValue()和containsKey()方法。
如何實現HashMap的同步?
HashMap能夠經過下面的語句進行同步:Map m = Collections.synchronizeMap(hashMap);
,具體而言,該方法返回一個同步的Map,該Map封裝了底層的HashMap的全部方法,使得底層的HashMap即便是在多線程的環境中也是安全的。
Collection、List、Set、Map都是接口,不能實例化。
JAVA集合只能存放引用類型的的數據,不能存放基本數據類型。
基本數據類類型:存的是數值自己,java中有四類八種基本數據類型,
引用類型變量:存放的是數據的引用地址,並非數據的自己,引用類型變量是以間接方式去獲取數據。引用類型變量都指向對象,如:數組、類、字符串等。
Collection接口的經常使用方法:
List,Set是繼承自Collection接口,Map不是。因此記不清隊列和棧的添加和刪除函數時,一概用add和remove。
一、Collection沒有get()方法來取得某個元素,只能經過iterator()遍歷元素。 二、Set和Collection擁有如出一轍的接口。 三、List,能夠經過get()方法來一次取出一個元素,使用數字來選擇一堆對象中的一個,get(0)...。(add/get)。 四、通常使用LinkedList構造棧stack、隊列queue。 五、Map用 put(k,v) / get(k),還可使用containsKey()/containsValue()來檢查其中是否含有某個key/value。HashMap會利用對象的hashCode來快速找到key。 六、Map中元素,能夠將key序列、value序列單獨抽取出來。使用keySet()抽取key序列,將map中的全部keys生成一個Set。使用values()抽取value序列,將map中的全部values生成一個Collection。 爲何一個生成Set,一個生成Collection?那是由於,key老是獨一無二的,value容許重複。