1、List的實現類,以及實現類的優缺點
a、ArrayList:實現是基於動態數組的數據結構
b、LinkedList:實現是基於鏈表的數據結構
c、Vector:同ArrayList的數據結構,但它是線程安全的
優缺點:
a、對於隨機訪問get,ArrayList優於LinkedList,因爲LinkedList要移動指針
b、對於新增和刪除操作add和remove,LinkedList優於ArrayList,應爲ArrayList需要移動數據
c、Vector是同步的,ArrayList/LinkedList是不同步的(在多線程的情況下,有時候就不得不使用Vector了)
d、ArrayList和Vector都是使用Objec的數組形式來存儲的,Vector缺省情況下自動增長原來一倍的數組長度,ArrayList是原來的50%
2、Map的實現類,以及實現類的優缺點
a、HashMap:基於Hash表實現、線程不安全、key允許爲null
b、LinkedHashMap:LinkedHashMap是HashMap的一個子類,它保留插入的順序
c、TreeMap:基於紅黑樹、線程不安全、可自定義排序器
d、HashTable:基於單向鏈的二維數組,有序存儲、key值不允許爲null、線程安全的,synchronized是針對整張Hash表的,即每次鎖住整張表讓線程獨佔
e、ConcurrentHashMap:ConcurrentHashMap和HashTable主要區別就是圍繞着鎖的粒度以及如何鎖
優缺點:
a、ConcurrentHashMap的三點:
ConcurrentHashMap的鎖分段技術(鎖桶或段)
ConcurrentHashMap的鎖是否需要加鎖,爲什麼?(否,完全併發)
ConcurrentHashMap的迭代器是弱一致性
b、HashTable與ConcurrentHashMap(線程安全)
HashTable和ConcurrentHashMap主要區別就是圍繞着鎖的粒度以及如何鎖
如圖所示:左邊是HashTable的實現方式——鎖整個Hash表;右邊是ConcurrentHashMap的實現方式——鎖桶(或段),ConcurrentHashMap將Hash表分爲16個桶(默認值,如get、put、remove等常用操作只鎖當前用到的桶),原來只能一個線程進入,現在同時16個寫線程進入(寫線程需要鎖定,讀線程幾乎不受限制),併發性提高。
ConcurrentHashMap的讀取併發,因爲在讀取時大多數時候並沒有用到鎖,所以讀取操作幾乎完全的併發操作,而寫操作鎖定的粒度又非常細,比之前又更加快速(在桶更多時表現得更明顯),只是在求size等操作時才需要鎖定整個表。
在迭代時,ConcurrentHashMap使用了弱一致迭代器。在迭代中,當iterator被創建後集合再發生改變就不再拋出ConcurrentModificationException,取而代之的是改變時new新的數據從而不影響原來的數據,iterator完成後再將頭指針替換爲新的數據。這樣iterator線程可以使用原來老的數據,而寫線程也可以併發完成改變。更重要的是,保證了多線程併發執行的連續性和擴展性,是性能提升的關鍵字。
ConcurrentHashMap中主要三個實現類:
ConcurrentHashMap(整個Hash表)
Segment(桶)
HashEntry(節點)
3、set的實現
HashSet:使用map來存儲,因此值不可重複 初始化new HashMap()
LinkedHashSet:初始化 new LinkedHashMap(16,.75f,true);
實例:
//list
/*
* 1.ArrayList是實現了基於動態數組的數據結構,LinkedList基於鏈表的數據結構。
* 2.對於隨機訪問get,ArrayList覺得優於LinkedList,因爲LinkedList要移動指針。
* 3.對於新增和刪除操作add和remove,LinedList比較佔優勢,因爲ArrayList要移動數據。
* 4.Vestor是同步的,ArrayList/LinkedList是不同步的(在多線程的情況下,有時候就不得不使用Vector了)
* 5.ArrayList和Vector都是使用Objec的數組形式來存儲的,Vector缺省情況下自動增長原來一倍的數組長度,ArrayList是原來的50%
*/
List<String> list1 = new ArrayList<String>(); //順序表 默認10
list1.add("1");
List<String> list2 = new LinkedList<String>(); //鏈表
list1.add("1");
List<String> list3 = new Vector<String>();
list3.add("1");
Collections.sort(list1); //Arrays.sort() 1、使用歸併排序,在未來的JDK版本中將會被丟棄 2、源於歸併排序和插入排序的混合排序算法
//map
Map<String, Object> map1 = new HashMap<String, Object>(); //1、線程不安全 2、基於hash表實現 3、key允許爲null
map1.put("1", 1);
Map<String, Object> map2 = new LinkedHashMap<String, Object>(); // LinkedHashMap是HashMap的一個子類,它保留插入的順序
map2.put("1", 1);
Map<String, Object> map3 = new TreeMap<String, Object>(); //1、線程不安全 2、基於紅黑樹 3、可自定義排序器
map3.put("1", 1);
//1、有序的存儲 2、單向鏈的二維數組 3、key不允許爲null 4、synchronized是針對整張Hash表的,即每次鎖住整張表讓線程獨佔
Map<String, Object> map4 = new Hashtable<String, Object>();
map4.put("1", 1);
//ConcurrentHashMap和Hashtable主要區別就是圍繞着鎖的粒度以及如何鎖
Map<String, Object> map5 = new ConcurrentHashMap<String, Object>();
map5.put("1", 1);
//set
Set<String> set1 = new HashSet<String>(); //使用map來存儲,因此值不可重複 初始化new HashMap();
set1.add("1"); // map.put("1", PRESENT);
Set<String> set2 = new LinkedHashSet<String>(); //初始化 new LinkedHashMap(16,.75f,true);
set2.add("1");