博客
关于我
ArrayList、LinkedList原理
阅读量:652 次
发布时间:2019-03-15

本文共 1817 字,大约阅读时间需要 6 分钟。

ArrayList与线程安全

ArrayList实现机制

ArrayList之所以成为Java开发者常用的集合之一,主要是因为其基于数组实现,具有随机访问和迭代操作的优势。然而,作为一个不安全的集合类,ArrayList在并发环境下可能面临数据一致性问题。

ArrayList的原始实现

ArrayList的底层是一个动态数组,称为elementData。初始化时,默认容量为10。当元素数量增长到容量限制时,会按1.5倍扩展容量,确保操作效率。

ArrayList的构造方式

调用ArrayList的无参构造器时,元素数据数组初始化为空数组。首次添加元素时,会扩容,设定容量为10。若使用有参构造器,则直接创建指定初始容量的数组。

public ArrayList() {    this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;}

在有参构造器中:

public ArrayList(int initialCapacity) {    if (initialCapacity > 0) {        this.elementData = new Object[initialCapacity];    } else if (initialCapacity == 0) {        this.elementData = EMPTY_ELEMENTDATA;    } else {        throw new IllegalArgumentException("Illegal Capacity: " + initialCapacity);    }}

ArrayList的添加与扩容

添加元素时,首先检查当前容量是否足够。如果不够,则调用ensureCapacityInternal方法扩展数组。默认扩容策略是将当前容量增加到原容量的1.5倍。

public boolean add(E e) {    ensureCapacityInternal(size + 1);    elementData[size++] = e;    return true;}

当容量不足时,ensureCapacityInternal方法会构造一个新数组,将原有数据复制到新数组,并设置新的数组地址指向新数组。

remove与set方法的实现

删除或修改元素的操作会导致数组结构被破坏,需要重新计算索引位置。remove方法叫用Arrays.copyOf实现数据复制和数组更新,以保持数据一致性。

ArrayList与LinkedList对比

LinkedList基于双向链表实现,优于ArrayList在以下方面:

  • 插入和删除:在链表结构中,插入和删除操作可以直接通过指针修改,无需大量数组移动。当索引在前半部分时,从头节点开始遍历;否则,从尾节点开始遍历。

List的线程安全实现

为了应对多线程环境下的数据竞态,Java提供了Collections.synchronizedList(List list)方法。通过包装原始列表,提供线程安全的视图。

public static 
List
synchronizedList(List
list) { return (list instanceof RandomAccess ? new SynchronizedRandomAccessList<>(list) : new SynchronizedList<>(list));}

CopyOnWriteArrayList的线程安全机制

CopyOnWriteArrayList通过复制整个列表实现线程安全。每次读取或修改操作前,都会创建一个新的数组副本,确保并发操作下数据的一致性。

迭代器的使用陷阱与优化

在使用增强for循环时,不能修改原始集合。在发现ConcurrentModificationException异常时,需检查是否有其他线程修改了数据,也可以通过避免不必要的读操作来提升性能。

通过以上理解,可以更加合理地选择集合类型,并在并发编程中妥善处理线程安全问题。选择集合不仅关乎性能,还关系到代码的可维护性和稳定性。

转载地址:http://jrymz.baihongyu.com/

你可能感兴趣的文章
python+flask计算机毕业设计高校网上迎新系统(程序+开题+论文)
查看>>
python+flask计算机毕业设计高校运动会(程序+开题+论文)
查看>>
python+flask计算机毕业设计高校选课系统(程序+开题+论文)
查看>>
Python+Jenkins+Allure Report接口自动化测试持续集成
查看>>
python+locust电商全流程性能测试
查看>>
Python函数运行的可执行文件的终端输出如何以一般方式静音?
查看>>
Python+Pytest+Allure+Git+Jenkins接口自动化框架
查看>>
python+pytest接口自动化 —— 参数关联
查看>>
python+pytest接口自动化 —— 参数关联
查看>>
Python+pytest接口自动化 —— 接口测试基础
查看>>
python+pytest接口自动化 —— 自动化用例编写思路 (使用pytest编写一个测试脚本)
查看>>
Python+pytest接口自动化之cookie绕过登录(保持登录状态)
查看>>
python+pytest接口自动化:接口测试
查看>>
Python+requests+unittest执行接口自动化测试详情
查看>>
Python+requests+unittest执行接口自动化测试详情
查看>>
python+requests+unittest执行自动化接口测试!
查看>>
Python+Requests编码识别Bug
查看>>
python函数编写_[零基础学python]传说中的函数编写条规
查看>>
Python+selenium —— UI自动化之鼠标操作
查看>>
python函数注释,参数后面加冒号:,函数后面的箭头→是什么?
查看>>