`

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
分享到:
评论

相关推荐

    java并发容器CopyOnWriteArrayList实现原理及源码分析

    Java并发容器CopyOnWriteArrayList是Java并发包中提供的一个并发容器,实现了线程安全且读操作无锁的ArrayList,写操作则通过创建底层数组的新副本来实现。这种读写分离的并发策略使得CopyOnWriteArrayList容器允许...

    ArrayList演示

    最后,值得注意的是ArrayList与LinkedList之间的区别。LinkedList提供了更快的插入和删除速度,但访问元素的速度较慢,因为它需要从头或尾部开始遍历。因此,在选择容器类型时,需要根据应用场景来权衡。 总的来说...

    用ArrayList实现用户信息的添加,删除,更新,查询

    在实际应用中,我们还应该考虑线程安全问题,尤其是在多线程环境下,可能需要使用Collections.synchronizedList()来同步ArrayList,或者使用CopyOnWriteArrayList避免并发修改引发的问题。此外,为了提高代码的...

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

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

    List集合之ArrayList

    ArrayList是Java集合框架中List接口的一个具体实现,它继承了AbstractList抽象类,并实现了List、RandomAccess、Cloneable和Serializable接口。ArrayList的核心特点是其内部基于动态数组的数据结构,即使用Object...

    ArrayList,HashMap

    对于并发场景,可以使用CopyOnWriteArrayList(线程安全的ArrayList变体)和ConcurrentHashMap(线程安全的HashMap变体)。 总之,ArrayList和HashMap是Java集合框架中的重要组件,理解它们的工作原理和适用场景,...

    集合ArrayList测试集合ArrayList测试集合ArrayList测试

    如果需要在多线程环境下使用,可以考虑使用`Collections.synchronizedList`方法对`ArrayList`进行同步,或者使用`CopyOnWriteArrayList`。 4. **效率比较**:相比于`LinkedList`,`ArrayList`在插入和删除元素时...

    arrayliSt---listDemo

    ArrayList不是线程安全的,如果在多线程环境下操作,需要同步访问或使用`CopyOnWriteArrayList`。 10. **异常处理** 在操作ArrayList时,需要注意边界检查,防止出现`IndexOutOfBoundsException`。例如,`get()`...

    深入Java集合学习系列:ArrayList的实现原理

    在Java编程中,ArrayList是集合框架中一个重要的类,属于List接口的实现,它提供了动态数组的功能,允许我们在集合中存储、添加、删除元素,并且可以按索引访问。这篇文章将深入探讨ArrayList的内部实现原理,帮助...

    深入Java集合学习系列(三):ArrayList实现原理

    首先,ArrayList是Java集合框架中List接口的一个非常重要的实现。它允许包含重复的元素,也允许插入null值,这是区别于Java集合中的另一个List接口实现类LinkedList的重要特点。ArrayList内部通过一个数组来保存其...

    ArrayList和Linkedlist1

    在IT领域,特别是Java编程中,ArrayList和LinkedList是两种非常重要的数据结构,它们都是List接口的实现类。理解这两者的区别对于优化程序性能至关重要。面试官询问这些知识点,旨在评估应聘者的理论基础和实践能力...

    ArrayList源码分析

    7. **ArrayList与LinkedList的比较** - ArrayList更适合于随机访问,插入和删除在中间位置较慢。 - LinkedList适合于频繁的插入和删除,但随机访问性能较差。 8. **内存效率** ArrayList的内存开销主要来自于...

    List效率的比较

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

    java的list取之方法

    根据提供的文件信息,标题与描述均指向了Java中List的操作方法。然而,给出的部分内容却是一段关于导入Excel文件到Web应用中的代码片段,并没有直接涉及List的具体操作方法。因此,我们将结合标题与描述,围绕Java中...

    Java的CopyOnWriteArrayList功能详解,及无法保证数据是实时同步.docx

    与`Vector`相比,`CopyOnWriteArrayList`在性能上有显著优势。`Vector`通过在每个方法上使用`synchronized`关键字实现了线程安全,但这导致了较高的锁粒度,即每次修改都需要获取全局锁,严重影响了并发性能。例如,...

    Java中ArrayList类的用法知识.pdf

    4. **ArrayList与数组之间的转换** - 可以通过`ToArray`方法将ArrayList转换为数组,如示例所示,需要指定目标类型。 - 数组也可以转换为ArrayList,如`ArrayList list = new ArrayList(array);` 5. **线程安全与...

    我的ArrayList实现

    ArrayList是Java集合框架中的一员,它是List接口的一个具体实现,以动态数组的形式存储元素。ArrayList的实现原理、操作方法以及在实际编程中的应用都是Java程序员必须掌握的重要知识点。 首先,ArrayList的底层...

    java集合-CopyOnWriteArrayList的使用

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

    Java系列ArrayList

    ArrayList与传统的固定大小的数组不同,它没有固定的容量限制,可以在需要时自动调整大小,方便地进行元素的添加、删除和修改。 ### ArrayList的基本操作 #### 1. 添加元素 要向ArrayList中添加元素,可以使用`add...

    ArrayList的学习821.docx

    ArrayList是Java集合框架中List接口的一个重要实现类,它的核心特性是基于数组实现,提供了动态扩容的功能,使得在存储元素时无需预先确定其大小。在深入理解ArrayList之前,我们需要了解List接口的一些基本概念。 ...

Global site tag (gtag.js) - Google Analytics