zoukankan      html  css  js  c++  java
  • ArrayList、Vector、LinkedList、CopyOnWriteArrayList等详解

    ArrayList、Vector、LinkedList和CopyOnWriteArrayList的分析

    count的专栏 2020-01-09 14:30:50 283 收藏 3
    分类专栏: Java集合
    版权
    1.ArrayList和LinkedList的区别
    (1) ArrayList 基于动态数组实现,数组支持随机访问,但插入删除的代价很高,需要移动大量元素。
    (2) LinkedList 基于双向链表实现,链表不支持随机访问,但插入删除只需要改变指针。

    2. Vector和ArrayList的区别
    (1) Vector的实现与 ArrayList 类似,但是使用了 synchronized 进行同步。因此开销就比 ArrayList 要大,访问速度更慢。最好使用 ArrayList 而不是 Vector,因为同步操作完全可以由程序员自己来控制;
    (2) 当Vector或ArrayList中的元素超过它的初始大小时,Vector 每次扩容请求其大小的 2 倍(也可以通过构造函数设置增长的容量),而 ArrayList 是 1.5 倍,ArrayList就有利于节约内存空间。
    备注: 对于Vector&ArrayList、Hashtable&HashMap,要记住线程安全的问题,记住Vector与Hashtable是旧的,是java一诞生就提供了的,它们是线程安全的,ArrayList与HashMap是java2时才提供的,它们是线程不安全的。
    数据增长:
    ArrayList与Vector都有一个初始的容量大小,当存储进它们里面的元素的个数超过了容量时,就需要增加ArrayList与Vector的存储空间,每次要增加存储空间时,不是只增加一个存储单元,而是增加多个存储单元,每次增加的存储单元的个数在内存空间利用与程序效率之间要取得一定的平衡。Vector默认增长为原来两倍,而ArrayList的增长策略在文档中没有明确规定(从源代码看到的是增长为原来的1.5倍)。ArrayList与Vector都可以设置初始的空间大小,Vector还可以设置增长的空间大小,而ArrayList没有提供设置增长空间的方法。

    3.CopyOnWriteList
    3.1 读写分离
    (1) 写操作在一个复制的数组上进行,读操作还是在原始数组中进行,读写分离,互不影响。
    (2) 写操作需要加锁,防止并发写入时导致写入数据丢失。
    (3) 写操作结束之后需要把原始数组指向新的复制数组。

    /**
    * Appends the specified element to the end of this list.
    *
    * @param e element to be appended to this list
    * @return {@code true} (as specified by {@link Collection#add})
    */
    public boolean add(E e) {
    final ReentrantLock lock = this.lock;
    lock.lock();
    try {
    Object[] elements = getArray();
    int len = elements.length;
    Object[] newElements = Arrays.copyOf(elements, len + 1);
    newElements[len] = e;
    setArray(newElements);
    return true;
    } finally {
    lock.unlock();
    }
    }
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    3.2 使用场景
    缺陷:
    内存占用: 在写操作时需要复制一个新的数组,使得内存占用为原来的两倍左右;
    数据不一致:读操作不能读取实时性的数据,因为部分写操作的数据还未同步到读数组中。
    (1) CopyOnWriteArrayList 不适合内存敏感以及对实时性要求很高的场景。
    (2) CopyOnWriteArrayList 在写操作的同时允许读操作,大大提高了读操作的性能,因此很适合读多写少的应用场景。

    4. ArrayList & Vector & LinkedList & CopyOnWriteArrayList
    这四个集合类都继承List接口
    (1) ArrayList和LinkedList是线程不安全的
    (2) Vector是比较古老的线程安全的,但性能不行;
    (3) CopyOnWriteArrayList在兼顾了线程安全的同时,又提高了并发性,性能比Vector有不少提高
    ————————————————
    版权声明:本文为CSDN博主「count的专栏」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/xiao_count/article/details/103906337

  • 相关阅读:
    MDK中编译程序后Program Size详解
    win10快速访问的文件夹无法删除的解决方法
    stm32类型cl、vl、xl、ld、md、hd的含义
    史上最全软件测试工程师常见的面试题总结(四)【多测师_王sir】
    基于PO和单例设计模式用python+selenium进行ui自动化框架设计【多测师】
    经典的Python编程题【多测师_王sir】
    Java中的泛型【多测师_王sir】【软件测试】
    Java设计模式之单例模式、工厂模式、PO模式【多测师_王sir】
    Java+Selenium做UI自动化中@FindBy和@CacheLookup用法【多测师_王sir】
    postman中接口的入参为图片的处理方式【多测师_王sir】
  • 原文地址:https://www.cnblogs.com/hanease/p/14905073.html
Copyright © 2011-2022 走看看