文档章节

ArrayList, LinkedList, CopyOnWriteArrayList, Vector对比

1024菜bird
 1024菜bird
发布于 03/12 11:11
字数 549
阅读 29
收藏 1

1. 列表划分为线程安全和线程非安全两类

线程安全:Vector,CopyOnWriteArrayList,Collections.synchronizedList()

线程非安全:ArrayList,LinkedList

2. 底层存储

数组:ArrayList, Vecotr, CopyOnWriteArrayList

双向链表:LinkedList

通过三个添加元素的过程图,来看数据结构

ArrayList,Vector: 底层存储为数组

 

LinkedList: 底层存储为双向链表

CopyArrayList:底层存储为数组

3. 使用场景和说明

ArrayList

  • 底层为数组,适合随机访问

  • 删除不会引起数组容量变小

  • 动态插入可能涉及到数组长度重新分配

  • 为避免频繁的数组扩容,可设置一个合适的初始容量

  • 不适用于频繁的在数组中间进行插入删除的场景

 LinkedList

  • 底层为双向链表,适合频繁删除新增的场景

  • 随机访问不友好,需要遍历

Vector

  • 线程安全

  • 所有的方法都加锁,导致性能较差

CopyOnWriteArrayList

  • 线程安全

  • 读方法不加锁;修改方法加锁,一次只能一个写线程访问

  • 修改时,会拷贝一份内容出来,对拷贝的结果进行操作,最后覆盖之前的内容;每次修改都会先上锁,然后进行数组拷贝,所以性能较ArrayList低;读取无锁,所以读的性能比Vector高(没有竞争);默认初始容量为0

  • 遍历和读取都是基于访问时刻列表中的数组进行的;在执行过程中,链表发生修改不会影响遍历和读取的结果(即此时访问的依然是原数组内容)

 4. 特性

1. List是有序的

2. ArrayList默认容量为10;

3. LinkedList,CopyOnWriteArrayList默认容量为0

4. new ArrayList<>()内部的数组实际上引用的是一个空数组

5. 需要线程安全的场景,使用CopyOnWriteArrayList(并发读性能好)或Collections.synchronizedList(并发写性能好)来替代Vector

6. ArrayList扩容规则

  • 增加原来空间大小的一半

  • 如果依然塞不下,则扩充到正好填充满的情况

7. 排序

  • Collections.sort(list, new Comparator(){xxx})

  • 若List中的元素,实现了Comparable接口后,可以直接调用Collections.sort(list);

© 著作权归作者所有

共有 人打赏支持
1024菜bird
粉丝 74
博文 141
码字总数 138266
作品 0
海淀
程序员
JDK容器学习之List: CopyOnWriteArrayList,ArrayList,LinkedList对比

列表 List, ArrayList, LinkedList, CopyOnWriteArrayList, Vector 简述 1. 列表划分为线程安全和线程非安全两类 线程安全: , , 线程非安全:, 2. 底层存储 数组: 双向链表: 通过三个添加...

小灰灰Blog
2017/10/21
0
0
ArrayList VS Vector VS LinkedList

ArrayList VS Vector 相同点:1>都是基于Object数组实现的。2>都允许添加null元素。 不同点:1>ArrayList不是线程安全的,Vector是线程安全的(方法是Synchronized的)。2>ArrayList扩容后容量...

A__17
03/05
0
0
JDK容器学习之CopyOnWriteArrayList:线程安全保障机制

JDK容器学习之CopyOnWriteArrayList 列表容器常见的有ArrayList和LinkedList,然而两者都是非线程安全的,若应用场景对线程安全有需求,则可以使用CopyOnWriteArrayList来代替传统的Vector ...

孟飞阳
2017/10/20
0
0
集合(二):List接口。

一:List接口: 继承自Collection,如下: 1.ArrayList( 实现类): ArrayList 是一个数组队列,相当于 动态数组。与Java中的数组相比,它的容量能动态增长。它继承于AbstractList,实现了L...

牧羊人Berg
2016/05/25
100
0
Android基础之Java集合框架Collection

一、Collection是什么 首先我们一起来探讨一下Collection究竟是什么个玩意,如上图所示List、Set、Queue、Map都指向Collection,它们都只是一个接口,并不是实现类。正因为有了Collection集合...

silencezwm
07/03
0
0

没有更多内容

加载失败,请刷新页面

加载更多

一生产与一消费:操作栈

1:创建栈代码如下 public class MyStack { private List list = new ArrayList(); synchronized public void push() { try { if (list.size() == 1) {......

起个昵称好难啊
24分钟前
1
0
vue中vuex简单实例

1.安装 npm install vuex --save 2.store.js import Vue from 'vue';import Vuex from 'vuex';Vue.use(Vuex);const store = new Vuex.Store({state: {count: 900000},g......

帝子兮
30分钟前
0
0
使用Golang实现网页爬虫

使用Golang实现网页爬虫

coderminer
33分钟前
1
0
30 个免费的 Sketch 必备插件

简评:中秋三天小长假,要不要学点啥?比如简单的设计?比如用 Sketch 做个项目? Sketch 有许多值得称赞的地方,其丰富的插件就是亮点之一。Sketch 的社区有着大量免费高效的插件。今天这篇...

极光推送
44分钟前
1
0
web打印控件 LODOP的详细api

web打印控件 LODOP的详细api

wangxujun59
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部