博客
关于我
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/

你可能感兴趣的文章
php后台“爬虫”模拟登录第三方系统
查看>>
php后台的在控制器中就可以实现阅读数增加
查看>>
php命令行生成项目结构
查看>>
php命名空间
查看>>
PHP命名空间带来的干扰
查看>>
PHP和MySQL Web开发从新手到高手,第1天-搭建PHP开发环境
查看>>
php商店管理系统,基于PHP的商店管理系统.doc
查看>>
PHP四大主流框架的优缺点总结
查看>>
PHP图片处理—PNG透明缩放并生成灰图
查看>>
php在liunx系统中设置777权限不起作用解决方法
查看>>
PHP基于openssl实现的非对称加密操作
查看>>
php基本符号大全
查看>>
php基础篇-二维数组排序 array_multisort
查看>>
php基础配置环境变量
查看>>
php增删改查封装方法
查看>>
springboot之jar包Linux后台启动部署及滚动日志查看且日志输出至文件保存(超级详细)
查看>>
php多条件筛选功能的实现
查看>>
php多线程
查看>>
PHP大数组循环-避免产生Notice或者是Warning
查看>>
PHP大数组过滤元素、修改元素性能分析
查看>>