首页
学习
活动
专区
工具
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元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券
http://www.vxiaotou.com