ArrayList和CopyOnWriteArrayList的区别

二者都 ArrayList CopyOnWriteArray 实现列表接口。但是ArrayList和CopyOnWriteArrayList之间有很多区别:

null
  • CopyOnWriteArrayList创建基础ArrayList的克隆副本,对于特定点的每次更新操作,这两个操作都将自动同步,由JVM负责。因此,对执行读取操作的线程没有影响。因此,ArrayList中没有线程安全,而CopyOnWriteArrayList是线程安全的。
  • 当一个线程迭代ArrayList对象时,如果另一个线程尝试进行修改,那么我们将得到运行时异常ConcurrentModificationException。在CopyOnWriteArrayList的情况下,我们不会得到任何例外。
  • ArrayList是在JDK 1.2中引入的,而CopyOnWriteArrayList是由SUN people在JDK 1.5中引入的。
  • ArrayList的迭代器可以在迭代时执行删除操作。但是CopyOnWriteArrayList的迭代器在迭代时不能执行删除操作,否则会抛出运行时异常UnsupportedOperationException。

    以下是这一点的实施。

// Java program to illustrate ArrayList
import java.util.*;
class CopyDemo
{
public static void main(String[] args)
{
ArrayList l = new ArrayList();
l.add( "A" );
l.add( "B" );
l.add( "C" );
Iterator itr = l.iterator();
while (itr.hasNext())
{
String s = (String)itr.next();
if (s.equals( "B" ))
{
// Can remove
itr.remove();
}
}
System.out.println(l);
}
}


输出:

[A,C]

// Java program to illustrate CopyOnWriteArrayList
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.*;
class CopyDemo extends Thread {
static CopyOnWriteArrayList l = new CopyOnWriteArrayList();
public static void main(String[] args)
throws InterruptedException
{
l.add( "A" );
l.add( "B" );
l.add( "C" );
Iterator itr = l.iterator();
while (itr.hasNext())
{
String s = (String)itr.next();
System.out.println(s);
if (s.equals( "B" ))
{
// Throws RuntimeException
itr.remove();
}
Thread.sleep( 1000 );
}
System.out.println(l);
}
}


输出:

A
B
Exception in thread "main" java.lang.UnsupportedOperationException
© 版权声明
THE END
喜欢就支持一下吧
点赞8 分享