文档章节

ArrayList, LinkedList, CopyOnWriteArrayList, Vector对比

1024菜bird
 1024菜bird
发布于 03/12 11:11
字数 549
阅读 34
收藏 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
粉丝 75
博文 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

没有更多内容

加载失败,请刷新页面

加载更多

OSChina 周日乱弹 —— 钱不还,我就当你人不在了

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @莱布妮子 :分享Bigleaf的单曲《小鹿》 《小鹿》- Bigleaf 手机党少年们想听歌,请使劲儿戳(这里) 周日在家做什么? 做手工呀, @poorfis...

小小编辑
55分钟前
20
3
EOS docker开发环境

使用eos docker镜像是部署本地EOS开发环境的最轻松愉快的方法。使用官方提供的eos docker镜像,你可以快速建立一个eos开发环境,可以迅速启动开发节点和钱包服务器、创建账户、编写智能合约....

汇智网教程
今天
17
0
《唐史原来超有趣》的读后感优秀范文3700字

《唐史原来超有趣》的读后感优秀范文3700字: 作者:花若离。我今天分享的内容《唐史原来超有趣》这本书的读后感,我将这本书看了一遍之后就束之高阁了,不过里面的内容一直在在脑海中回放,...

原创小博客
今天
23
0
IC-CAD Methodology知识图谱

CAD (Computer Aided Design),计算机辅助设计,指利用计算机及其图形设备帮助设计人员进行设计工作,这个定义同样可以用来近似描述IC公司CAD工程师这个岗位的工作。 早期IC公司的CAD岗位最初...

李艳青1987
今天
28
0
CompletableFuture get方法一直阻塞或抛出TimeoutException

问题描述 最近刚刚上线的服务突然抛出大量的TimeoutException,查询后发现是使用了CompletableFuture,并且在执行future.get(5, TimeUnit.SECONDS);时抛出了TimeoutException异常,导致接口响...

xiaolyuh
今天
13
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部