zoukankan      html  css  js  c++  java
  • LIst集合

    Vrctor源码

     

    ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

    ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

     ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

     

     

     

    ArrayList源码

    Collections.synchronizedList();

    CopyOnWriteArrayList<>().add

     

    LinkedList源码

     ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

     

     ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

     

    总结:

    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设计思想是怎么样的,有什么缺点?


    设计思想:读写分离,最终一致
    缺点:内存占用,由于写时复制,内存中就会出现两个对象占用空间,如果对象大则容易发生YongGC和FullGC


    1.5 说一下ArrayList扩容机制是怎么样的


    1.7 以及之前版本JDK,首先从默认大小来讲,默认为10
    1.8 ArrayList集合大小如果创建时没有指定,则默认为0,若已经指定集合大小,则初始值为指
    当第一次添加数据的时候,集合大小扩容为10,第二次及其后续每次按照int oldCapacity = elementData.length; newCapacity = oldCapacity+(oldCapacity>>1)

  • 相关阅读:
    利用 PhpStorm、Idea 等 IDE 如何 运行/调试 Go 程序 ?
    [Go] 函数/方法 的 变参
    PHP 如何显示大数字,防止显示为 科学计数法 形式
    PHP协程 详解
    [Go] 路径、目录名、包名、文件名
    [Go] 复合类型(数组、切片、字典、结构体)变量的 初始化 及 注意事项
    Firefox 及其 插件“个性化设置”备份
    Go
    [Go] template 常用方法详解 及 注意事项
    Go
  • 原文地址:https://www.cnblogs.com/ringqq/p/12492148.html
Copyright © 2011-2022 走看看