Java基礎-2、集合

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");


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章