Java集合优缺点总结

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

猜你喜欢

转载自blog.csdn.net/u010313441/article/details/77648081
今日推荐