1、List、Set和Map的區別數組
List:1.能夠容許重複的對象 安全
2.能夠插入多個Null元素併發
3.是一個有序容器,保持了每一個元素的插入順序,輸出順序就是插入時的順序性能
4.經常使用實現類:ArrayList、LinkedList和Vector,ArrayList基於數組實現的,是一個動態數組,能自動擴容,默認初始值爲10,每次擴容爲原來的1.5倍,線程不安全;LinkedList基於雙向鏈表實現的,插入和存取速度很快,線程不安全spa
Set:1.不容許重複的對象線程
2.無序容器,沒法保證每一個元素的順序對象
3.只容許一個Null元素接口
4.經常使用的實現類:HashSet、LinkedHashSet 以及 TreeSet。經常使用的爲HashSet,線程不安全,底層實現是一個HashMap,初始容量爲16,加載因子爲0.75,即當元素個數超過容量長度的0.75倍,進行擴容,擴容增量爲原來的1倍。rem
Map:1.Map不是Collection的子接口或者實現類,Map是一個接口。get
2.Map的每一個Entry都持有兩個對象,即鍵值對,Map可能持有相同的對象但鍵值對象必須是惟一的。
3.Map 接口最流行的幾個實現類是 HashMap、LinkedHashMap、Hashtable 和 TreeMap。
4.HashMap底層實現原理:數組加鏈表實現的,數組是HashMap的主體,鏈表是爲了解決哈希衝突而存在的,若是定位到的數組位置不包含鏈表(即當前ectry的next指向Null),查找添加會很快,僅需一次尋址就能夠,若是定位到的數組包含鏈表,添加時,須要遍歷鏈表,若是存在,則覆蓋,不然新增;查找時,仍需遍歷鏈表,經過key的equal方法逐一對比。
5.HashMap:能夠存儲Null鍵和Null值,初始值爲16,擴容時爲2的指數倍增長,線程不安全;
6.HashTable:底層爲數組加鏈表實現,不管是鍵仍是值都不容許爲Null,初始值爲11,擴容時爲原來的2倍加1,線程安全,put方法是synchronized的因此能夠保證其線程安全;實現線程安全的方式是在修改數據時鎖住整個HashTable,效率比較低
7.ConcurretHashMap:底層採用分段數組加鏈表實現,線程安全,默認將Hash分爲16個桶,get、put、remove等經常使用操做只鎖住當前須要用到的桶。每次只鎖住一個桶,原來只能有一個線程寫入,如今能夠有16個線程同時寫入,併發性能明顯提升。