首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

CopyOnWriteArrayList和ArrayList有哪些区别?

CopyOnWriteArrayList和ArrayList是Java中常用的List实现类,它们在实现和使用上有一些区别。

1. 线程安全性:

- ArrayList是非线程安全的,多个线程同时修改ArrayList可能会导致数据不一致或抛出ConcurrentModificationException异常。

- CopyOnWriteArrayList是线程安全的,多个线程可以同时对CopyOnWriteArrayList进行读操作,而写操作会进行复制,写操作之间是互斥的,保证了数据的一致性。

2. 内部实现:

- ArrayList使用可调整大小的数组实现,每次添加或删除元素时需要复制底层数组。如果频繁进行添加和删除操作,性能会受到影响。

- CopyOnWriteArrayList使用数组实现,但在写操作时会创建一个新的数组,并将旧数组的元素复制到新数组中。这样保证了读操作的线程安全性,但写操作的性能较低。

3. 迭代器:

- ArrayList的迭代器在迭代过程中,如果发现集合被修改了,会抛出ConcurrentModificationException异常。

- CopyOnWriteArrayList的迭代器可以安全地进行遍历,因为它遍历的是一个快照版本的数组,不会抛出ConcurrentModificationException异常。

适用场景:

- ArrayList适用于单线程环境或多线程环境下读操作远远多于写操作的场景,因为它的性能较高。

- CopyOnWriteArrayList适用于多线程环境下对集合进行频繁的读操作,而写操作相对较少的场景,例如读多写少的缓存场景。

示例代码:

import java.util.ArrayList;

import java.util.Iterator;

import java.util.List;

import java.util.concurrent.CopyOnWriteArrayList;

public class ArrayListVsCopyOnWriteArrayList {

public static void main(String[] args) {

// ArrayList示例

List arrayList = new ArrayList();

arrayList.add("A");

arrayList.add("B");

arrayList.add("C");

// 在迭代过程中使用ArrayList进行写操作会抛出ConcurrentModificationException异常

Iterator iterator1 = arrayList.iterator();

while (iterator1.hasNext()) {

String element = iterator1.next();

arrayList.remove(element);

}

// CopyOnWriteArrayList示例

List copyOnWriteArrayList = new CopyOnWriteArrayList();

copyOnWriteArrayList.add("A");

copyOnWriteArrayList.add("B");

copyOnWriteArrayList.add("C");

// 在迭代过程中使用CopyOnWriteArrayList进行写操作不会抛出异常

Iterator iterator2 = copyOnWriteArrayList.iterator();

while (iterator2.hasNext()) {

String element = iterator2.next();

copyOnWriteArrayList.remove(element);

}

}

}

输出:

Exception in thread "main" java.util.ConcurrentModificationException

at java.base/java.util.ArrayList$Itr.checkForComodification(ArrayList.java:969)

at java.base/java.util.ArrayList$Itr.next(ArrayList.java:919)

at ArrayListVsCopyOnWriteArrayList.main(ArrayListVsCopyOnWriteArrayList.java:17)

说明:在ArrayList的示例中,迭代器在遍历过程中尝试删除元素,导致抛出ConcurrentModificationException异常。而在CopyOnWriteArrayList的示例中,迭代器可以安全地遍历并删除元素。

  • 发表于:
  • 原文链接https://page.om.qq.com/page/OQLoa7c_mnGClVEpEdgaedaA0
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券