• 单列集合List


       1. Vector和ArrayList以及LinkedList区别和联系,和应用场景

      1.1 线程安全:

        Vector:

          如果创建Vector时没有指定容量,则默认容量为10,

        

           

          底层基于数组实现

        

         

        线程是安全的,底层采用synchronized同步方法进行加锁

                 

        ArrayList:

          底层基于数组

          

          线程不安全,查询和修改效率高,但是增加和删除效率低

                  


        LinkedList:底层双向链表结构,线程不安全,查询和修改效率低,但是增加和删除效率高

                

         

      1.2 应用场景

        1.2.1 Vector很少用

        1.2.2 如果需要大量的添加和删除则可以选择LinkedList

        1.2.3 如果需要大量的查询和修改则可以选择ArrayList

      2. 如果要保证ArraList线程安全,有几种方式?

        2.1 自己编写一个ArrayList集合类,根据业务一般来说,add/set/remove加锁

        2.2 利用Collections.synchronizedList(new ArrayList<>());   

        

       

       2.3 new CopyOnWriteArrayList<>().add("");   //采用 ReentrantLock加锁

                

      3. 了解CopyOnWriteArrayList底层   CopyOnWriteArrayList与Collections.synchronizedList有什么区别

        3.1 CopyOnWriteArrayList底层实现:
            CopyOnWriteArrayList在执行修改操作的时候,会复制一份新的数组数据,代价昂贵,修改过后将原来的集合

           指向到新的集合完成操作使用ReentrantLock保证多线程环境下的集合安全

      

            public boolean add(E e) {
                        final ReentrantLock lock = this.lock;            //获取了一把锁
                        lock.lock();                        //加锁
                        try {
                            Object[] elements = getArray();        //获取当前数组数据,给elements
                            int len = elements.length;            //记录当前数组的长度
                            Object[] newElements = Arrays.copyOf(elements, len + 1);        //复制一个新的数组
                            newElements[len] = e;    //将数据填入到新数组当中
                            setArray(newElements);    //将当前array指针指向到新的数据
                            return true;
                        } finally {
                            lock.unlock();            //释放锁
                        }

        应用场景:适用于读取操作远大于写操作场景(底层get读取时没有加锁,直接获取)

        3.2 Collections.synchronizedList几乎底层方法都加上了synchronized的锁(参考2.2图片)

          应用场景:写操作的性能比CopyOnWriteArrayList要好,但是读取的性能不如CopyOnWriteArrayList

      4. CopyOnWriteArrayList设计思想是怎么样的,有什么缺点?

        设计思想:读写分离,最终一致

        缺点:内存占用,由于写时复制,内存中就会出现两个对象占用空间,如果对象大则容易发生YongGC和FullGC

      

      5. ArrayList扩容机制是怎么样的

        1.7 以及之前版本JDK,首先从默认大小来讲,默认为10

        1.8 ArrayList集合大小如果创建时没有指定,则默认为0,若已经指定集合大小,则初始值为指设置大小

          

          

          

          

         当第一次添加数据的时候,集合大小扩容为10,第二次及其后续每次按照int oldCapacity = elementData.length;

          newCapacity = oldCapacity+(oldCapacity>>1)

          

  • 相关阅读:
    java创建节点和单向链表
    Java循环链表实现约瑟夫环(搬运)
    java语言建立顺序表
    顺序表删除重复值的高效算法。
    2016.1.29
    IO流学习笔记
    oracle 计算两个时间之间的月份差,相差几个星期,相差多少天
    java中如何计算两个时间段的月份差
    怎样在数据库中插入大量数据
    oracle 定义数据完整性
  • 原文地址:https://www.cnblogs.com/szhhhh/p/12493050.html
Copyright © 2020-2023  润新知