码迷,mamicode.com
首页 > 其他好文 > 详细

List集合面试题

时间:2020-03-14 18:39:21      阅读:58      评论:0      收藏:0      [点我收藏+]

标签:bool   来讲   指定   obj   方法   多线程   执行   效率   col   

    1.单列集合List
        1.1 Vector和ArrayList以及LinkedList区别和联系,以及分别的应用场景
            线程安全:
                Vector:如果创建Vector时没有指定容量,则默认容量为10,底层基于数组实现,线程是安全的,底层采用synchronized同步方法进行加锁

    技术图片

 

    技术图片

 

                 ArrayList:底层基于数组,线程不安全,查询和修改效率高,但是增加和删除效率低

    技术图片

 

 


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

 

 


            使用场景:
                1.Vector很少用
                2.如果需要大量的添加和删除则可以选择LinkedList
                3.如果需要大量的查询和修改则可以选择ArrayList
    
    
        1.2 如果要保证ArraList线程安全,有几种方式?
            1.2.1 自己重写一个ArrayList集合类,根据业务一般来说,add/set/remove加锁
            1.2.2 利用List<Object> list = Collections.synchronizedList(new ArrayList<>());           //采用synchronized加锁

      技术图片


            1.2.3 new CopyOnWriteArrayList<>().add("");            //采用 ReentrantLock加锁
            技术图片

 

 


        1.3 了解CopyOnWriteArrayList底层?,CopyOnWriteArrayList与Collections.synchronizedList有什么区别
            1.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();            //释放锁
                    }
                }


                CopyOnWriteArrayList应用场景:适用于读取操作远大于写操作场景(底层get读取时没有加锁,直接获取)
            
            1.3.2 Collections.synchronizedList几乎底层方法都加上了synchronized的锁
                场景:写操作的性能比CopyOnWriteArrayList要好,但是读取的性能不如CopyOnWriteArrayList
        
        
        1.4 CopyOnWriteArrayList设计思想是怎么样的,有什么缺点?
            设计思想:读写分离,最终一致
            缺点:内存占用,由于写时复制,内存中就会出现两个对象占用空间,如果对象大则容易发生YoungGC和FullGC
            
        
        1.5    说一下ArrayList扩容机制是怎么样的
            1.7 以及之前版本JDK,首先从默认大小来讲,默认为10
            1.8 ArrayList集合大小如果创建时没有指定,则默认为0,若已经指定集合大小,则初始值为指
               
                技术图片

 

     技术图片

 

     技术图片

 

     技术图片

 

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

     技术图片

 

List集合面试题

标签:bool   来讲   指定   obj   方法   多线程   执行   效率   col   

原文地址:https://www.cnblogs.com/chx9832/p/12490055.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!