List 存儲的元素是有順序的,而且值容許重複;
Map 元素按鍵值對存儲,無放入順序 ,它的鍵是不容許重複的,可是值是容許重複的;
Set 存儲的元素是無順序的,而且不容許重複,元素雖然無放入順序,可是元素在 set 中的位置是有該元素的 HashCode 決定的,其位置實際上是固定的。html
同步 synchronized數組
基於鏈表實現,鏈表內存是散列的,非線程安全,增刪快,查找慢;
優勢 LinkedList基於鏈表的數據結構,地址是任意的,因此在開闢內存空間的時候不須要一個連續的地址,對於新增和刪除操做,LinedList比較佔優點。
缺點 由於LinkedList要移動指針,因此查詢操做性能比較低。安全
基於數組實現,非線程安全,效率高,增刪慢,查找快;
優勢 ArrayList是實現了基於動態數組的數據結構,由於地址連續,一旦數據存儲好了,查詢操做效率會比較高(在內存裏是連着放的)。
缺點 由於地址連續, ArrayList要移動數據,因此插入和刪除操做效率比較低。數據結構
基於數組實現,線程安全,效率低,增刪慢,查找慢;併發
基於 hash 表的 Map 接口實現,非線程安全,高效,支持 null 值和 null 鍵;性能
實現一個key-value映射的哈希表,線程安全,低效,不支持 null 值和 null 鍵;
添加數據使用put(key, value),取出數據使用get(key),這兩個基本操做的時間開銷爲常數。
若是相同的對象有不一樣的hashCode,對哈希表的操做會出現意想不到的結果(get方法返回null),要避免這種問題,只須要牢記一條:要同時複寫equals方法和hashCode方法,而不要只寫其中一個。ui
是 HashMap 的一個子類,保存了記錄的插入順序;.net
TreeMap,可以把它保存的記錄根據鍵排序,默認是鍵值的升序排序。線程
底層是由 Hash Map 實現,不容許集合中有重複的值,使用該方式時須要重寫 equals()和 hash Code()方法;3d
繼承於 HashSet,同時又基於 LinkedHashMap 來進行實現,底層使用的是 LinkedHashMap。
ConcurrentHashMap 對整個桶數組進行了分段,而 HashMap 則沒有
ConcurrentHashMap 在每個分段上都用鎖進行保護,從而讓鎖的粒度更精細一些,併發性能更好,而 HashMap 沒有鎖機制,不是線程安全的
HashMap 基於 hashing 原理,咱們經過 put() 和 get() 方法儲存和獲取對象。當咱們將鍵值對傳遞給 put() 方法時,它調用鍵對象的 hashCode() 方法來計算 hashcode,讓後找到 bucket 位置來儲存值對象。當獲取對象時,經過鍵對象的 equals() 方法找到正確的鍵值對,而後返回值對象。HashMap 使用鏈表來解決碰撞問題,當發生碰撞了,對象將會儲存在鏈表的下一個節點中。 HashMap 在每一個鏈表節點中儲存鍵值對對象。
ConcurrentHashMap 採用了很是精妙的"分段鎖"策略,ConcurrentHashMap 的主幹是個 Segment 數組。Segment 繼承了 ReentrantLock,因此它就是一種可重入鎖(ReentrantLock)。在 ConcurrentHashMap,一個 Segment 就是一個子哈希表,Segment 裏維護了一個 HashEntry 數組,併發環境下,對於不一樣 Segment 的數據進行操做是不用考慮鎖競爭的。
HashMap 幾乎能夠等價於 HashTable,除了 HashMap 是非 synchronized 的,並能夠接受 null(HashMap 能夠接受爲 null 的鍵值 (key) 和值 (value),而 HashTable 則不行)。
HashMap 是非 synchronized,而 HashTable 是 synchronized,這意味着 HashTable 是線程安全的,多個線程能夠共享一個 HashTable;而若是沒有正確的同步的話,多個線程是不能共享 HashMap 的。Java 5 提供了 ConcurrentHashMap,它是 HashTable 的替代,比 HashTable 的擴展性更好。
另外一個區別是 HashMap 的迭代器 (Iterator) 是 fail-fast 迭代器,而 HashTable 的 enumerator 迭代器不是 fail-fast 的。因此當有其它線程改變了 HashMap 的結構(增長或者移除元素),將會拋出 ConcurrentModificationException,但迭代器自己的 remove() 方法移除元素則不會拋出 ConcurrentModificationException 異常。但這並非一個必定發生的行爲,要看 JVM。這條一樣也是 Enumeration 和 Iterator 的區別。
因爲 HashTable 是線程安全的也是 synchronized,因此在單線程環境下它比 HashMap 要慢。若是你不須要同步,只須要單一線程,那麼使用 HashMap 性能要好過 HashTable。
HashMap 不能保證隨着時間的推移 Map 中的元素次序是不變的。
LinkedList、ArrayList、HashSet是非線程安全的,Vector是線程安全的;
HashMap是非線程安全的,HashTable是線程安全的;
StringBuilder是非線程安全的,StringBuffer是線程安全的。
摘自 https://blog.csdn.net/abbuggy/article/details/7720666
摘自 http://www.javashuo.com/article/p-bczwepme-mt.html
摘自 http://www.javashuo.com/article/p-qxaiygei-dw.html
摘自 http://www.funtl.com/zh/interview/Java-%E9%9D%A2%E8%AF%95%E5%AE%9D%E5%85%B8-List-%E5%92%8C-Set-%E5%8C%BA%E5%88%AB.html