Vector、ArrayList、LinkedList、CopyOnWriteArrayList区别

原创转载请注明出处:https://www.cnblogs.com/agilestyle/p/11443907.html

 

CopyOnWriteArrayList

CopyOnWriteArrayList是java.util.concurrent包提供的方法,它实现了读操作无锁,写操作则通过操作底层数组的新副本来实现,是一种读写分离的并发策略。 

CopyOnWrite它的原理是,任何修改操作,如add、set、remove,都会拷贝原数组,修改后替换原来的数组,通过这种防御性的方式,实现另类的线程安全。

所以这种数据结构,相对比较适合读多写少的操作,不然修改的开销还是非常明显的,适用于读远大于写的场景。

Note:

CopyOnWriteArraySet是通过包装了CopyOnWriteArrayList来实现的

 

Vector

Vector是Java早期提供的线程安全的动态数组,synchronized关键字几乎修饰了所有对外暴露的方法,所以在读远大于写的操作场景中,Vector将会发生大量锁竞争,从而给系统带来性能开销。如果不需要线程安全,并不建议选择,毕竟同步是有额外开销的。Vector内部是使用对象数组来保存数据,可以根据需要自动的增加容量,当数组已满时,会创建新的数组,并拷贝原有数组数据。

 

ArrayList

ArrayList是应用更加广泛的动态数组实现,它本身不是线程安全的,所以性能要好很多。与Vector近似,ArrayList也是可以根据需要调整容量,不过两者的调整逻辑有所区别,Vector在扩容时会提高1倍,而ArrayList则是增加50%。

 

LinkedList

LinkedList是Java提供的双向链表,所以它不需要像上面两种那样调整容量,它也不是线程安全的。

 

posted @ 2019-09-01 22:03  李白与酒  阅读(975)  评论(0编辑  收藏  举报