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

你可能感兴趣的文章
Oracle11g静默安装dbca,netca报错处理--直接跟换操作系统
查看>>
oracle12安装软件后安装数据库,然后需要自己配置监听
查看>>
Oracle——08PL/SQL简介,基本程序结构和语句
查看>>
Oracle——distinct的用法
查看>>
Oracle、MySQL、SQL Server架构大对比
查看>>
oracle下的OVER(PARTITION BY)函数介绍
查看>>
Oracle中DATE数据相减问题
查看>>
Oracle中merge into的使用
查看>>
oracle中sql查询上月、本月、上周、本周、昨天、今天的数据!
查看>>
oracle中sql的case语句运用--根据不同条件去排序!
查看>>
Oracle中Transate函数的使用
查看>>
oracle中关于日期问题的汇总!
查看>>
Oracle中常用的语句
查看>>
Oracle中序列的操作以及使用前对序列的初始化
查看>>
oracle中新建用户和赋予权限
查看>>
Oracle中的NVL,NVL2,NULLIF以及COALESCE函数使用
查看>>
Oracle中的rownum 和rowid的用法和区别
查看>>
oracle中的大小写、字符、dual、数字、处理、日期、函数、显/隐式、时间、条件表达式case、decode、to_date、to_char、sysdate
查看>>
oracle中表和视图的区别,oracle中常用表和视图
查看>>
oracle之表空间(tablespace)、方案(schema)、段(segment)、区(extent)、块(block)
查看>>