`

CopyOnWriteArrayList与List(ArrayList)

阅读更多

CopyOnWriteArrayList,因何而存在?

ArrayList的一个线程安全的变体,其所有可变操作(addset 等)都是通过对底层数组进行一次新的复制来实现的,代价昂贵。

 

CopyOnWriteArrayList,是因”并发”而生。

 

 

CopyOnWriteArrayList,改了其中的某对象的某个值,

 

【场景一】对于ArrayList,使用直接方式,一边遍历,一边删除,会报错。

 // 删除/修改元素
 for(String item : list){
     list.remove(item);
 }

 

 

image

 

 解决办法一:使用迭代器,一边遍历,一边删除,不会报错。

// 删除/修改元素 
Iterator<String> it = list.iterator(); 
while(it.hasNext()){ 
    String ele = it.next(); 
    it.remove(); 

http://blog.sina.com.cn/s/blog_605f5b4f0100qsgf.html

 

解决办法二:使用CopyOnWriteArrayList,直接方式,一边遍历,一会删除,不会报错。

for(String item : list){ 
    list.remove(item); 

 

 

【场景二】对于ArrayList,使用迭代器,一边遍历,一边add,会报错。

Iterator<String> it = list.iterator(); 
while(it.hasNext()){ 
    String str = it.next(); 
    String tem = str + "..."; 
    list.add(tem); 

解决办法一:改用CopyOnWriteArrayList,直接方式,一边遍历,一边add,不会报错。

for(String item : list){ 
    String tem = item + "..."; 
    list.add(tem); 

解决办法二:改用CopyOnWriteArrayList,一边遍历,一边add,不会报错。

        Iterator<String> it = list.iterator(); 
        while(it.hasNext()){ 
            String str = it.next(); 
            String tem = str + "..."; 
            list.add(tem); 
        }

 

【场景三】对于CopyOnWriteArrayList,迭代器,不能remove。

Iterator<String> it = list.iterator(); 
while(it.hasNext()){ 
    String str = it.next(); 
    String tem = str + "..."; 
    it.remove(); 

image

 解决办法一:使用直接方式,一边遍历,一边add/remove()

for(String item : list){ 
    String tem = item + "..."; 
    list.remove(item); 
    list.add(tem); 

 

 

1
2
分享到:
评论

相关推荐

    今天会是有Offer的一天么:面试时不要再问我ArrayList、LinkedList和CopyOnWriteArrayList的区别了

    ArrayList是一种以数组实现的List,它实现了List, RandomAccess, Cloneable, Serializable接口。 实现List接口表示它可以支持删除、添加和查找等操作。 实现RandomAccess接口表示它可以支持随机访问(强调一点,并不...

    java集合-CopyOnWriteArrayList的使用

    在Java中,CopyOnWriteArrayList(写入时复制数组列表)是线程安全的集合类,它实现了List接口,并使用了"写入时复制"的策略来保证线程安全性。 CopyOnWriteArrayList的主要特点是:在进行修改操作(例如添加、修改...

    List效率的比较

     4.CopyOnWriteArrayList 因为线程安全的原因,致使性能降低很多,所以慎用;  5.Vector 没有传说中那么低的效率;  6.让Stack 来做List 的事可以,不过语义上Stack 不应该做过多的List 的事情;  7.在排序中,...

    Java中CopyOnWriteArrayList的使用

    java中,List在遍历的时候,如果被修改了会抛出java.util.ConcurrentModificationException错误。  看如下代码: import java.util.ArrayList;... List&lt;String&gt; a = new ArrayList(); a.add(a); a.add(b);

    集合效率不完全皮恩车

    AttributeList , ArrayList , CopyOnWriteArrayList , LinkedList RoleList , RoleUnresolvedList , Stack Vector Set接口 ConcurrentSkipListSet , CopyOnWriteArraySet , EnumSet…, HashSet JobStateReasons , ...

    java集合类原理面试题

    谈谈CopyOnWriteArrayList的原理 说一说TreeSet和HashSet的区别 说一说HashSet的底层结构 BlockingQueue是怎么实现的 Stream(不是IOStream)有哪些方法 BlockingQueue中有哪些方法,为什么这样设计?

    Java集合教程吐血整理干货.md

    ArrayList的特点 Vector的特点 LinkedList的特点 Set ConcurrentModificationException异常 线程安全的集合 线程安全的 List CopyOnWriteArrayList 线程安全的Set 线程安全的Map ConcurrentHashMap ...

    基于javatcpsocket通信的拆包和装包源码-all-in-one:知识点总结

    ArrayList与Vector的区别 两者都是基于索引,内部结构是数组 元素存取有序并都允许为null 都支持fail-fast机制 Vector是同步的,不会过载,而ArrayList不是,但ArrayList效率比Vector高,如果在迭代中对集合做修改...

    javabiginteger源码-MultiThreadMode:多线程模式

    java biginteger 源码 MultiThreadMode Single Thread Execution模式 使用synchronized方法或代码块,只能保证某一段代码是只能由一个线程执行。...CopyOnWriteArrayList线程安全的类,适用于读操作频繁的场景。 Gua

    Java容器.xmind

    List 标记: interface ArrayList 标记: class CRUD : boolean add​(E e) boolean remove​(Object o) E set​(int index, E element) E get​(int index) 底层数组实现,查询快,增删慢 LinkedList 标记: ...

    java8源码-JavaRobot:Java学习笔记,JavaLearningNote

    CopyOnWriteArrayList Vector Map源码系列 HashMap LinkedHashMap ConcurrentHashMap TreeMap Hashtable Set源码系列 HashSet LinkedHashSet TreeSet HashSet Concurrent源码系列 待完善 JVM(Java虚拟机) 类加载 ...

    java7hashmap源码-to-be-architect:成为Java架构师,你应该学习这些

    java7 hashmap源码 to-be-architect to be a Java architect,you should learn these.This page ...并发List Set:CopyOnWriteArrayList、CopyOnWriteArraySet、 ArrayList、 LinkedList Concurrent

    javalruleetcode-dsal:数据结构与算法个人整理

    集合与映射 :Hash 表 树形结构: : 二分查找树 : 平衡树 : 红黑树 : 线段树 : 字典树 其他: : 图 : 跳表 : 并查集 JDK 集合源码 基本 List, Set, Queue, Map ArrayList, LinkedList, Vector, ...

    【Java】常用数据集合体系和特点(汇总)

    Collection体系集合1.1 List 表① ArrayList 类(数组)② Vector 类(数组、线程同步)③ LinkedList 类(链表)④ CopyOnWriteArrayList 类(线程安全且高效的List)1.2 Set 集合① HashSet 类(HashCode)② ...

Global site tag (gtag.js) - Google Analytics