ArrayList底層實現是基於數組的,所以對指定下標的查找和修改比較快,可是刪除和插入操做比較慢。算法
構造ArrayList時儘可能指定容量,減小擴容時帶來的數組複製操做,若是不知道大小能夠賦值爲默認容量10。數組
每次添加元素以前會檢查是否須要擴容,每次擴容都是增長原有容量的一半。(擴容是建立一個新的數組,並將原來的數組元素遷移到新數組中)安全
每次對下標的操做都會進行安全性檢查,若是出現數組越界就當即拋出異常。數據結構
ArrayList的全部方法都沒有進行同步,所以它不是線程安全的。多線程
以上分析基於JDK1.7,其餘版本會有些出入,所以不能一律而論函數
private static class Node<E> { E item; //元素 Node<E> next; //下一個節點 Node<E> prev; //上一個節點 Node(Node<E> prev, E element, Node<E> next) { this.item = element; this.next = next; this.prev = prev; } }
LinkedList是基於雙向鏈表實現的,不管是增刪改查方法仍是隊列和棧的實現,均可經過操做結點實現性能
LinkedList無需提早指定容量,由於基於鏈表操做,集合的容量隨着元素的加入自動增長(無需執行默認長度,也沒有擴容需求)this
LinkedList刪除元素後集合佔用的內存自動縮小,無需像ArrayList同樣調用trimToSize()方法spa
LinkedList的全部方法沒有進行同步,所以它也不是線程安全的,應該避免在多線程環境下使用線程
LinkedList根據index查詢時採起的是二分法,即index小於總長度一半時從鏈表頭開始日後查找,大於總長度一半時從鏈表尾往前查找。若是是根據元素查找,則須要從頭開始遍歷
以上分析基於JDK1.7,其餘版本會有些出入,所以不能一律而論。
static class Entry<K,V> implements Map.Entry<K,V> { final K key; //鍵 V value; //值 Entry<K,V> next; //下一個Entry的引用 int hash; //哈希碼 ... //省略下面代碼 }
//生成hash碼的函數 final int hash(Object k) { int h = hashSeed; //key是String類型的就使用另外的哈希算法 if (0 != h && k instanceof String) { return sun.misc.Hashing.stringHash32((String) k); } h ^= k.hashCode(); //擾動函數 h ^= (h >>> 20) ^ (h >>> 12); return h ^ (h >>> 7) ^ (h >>> 4); }