文档章节

ArrayList, LinkedList, CopyOnWriteArrayList, Vector对比

1024菜bird
 1024菜bird
发布于 03/12 11:11
字数 549
阅读 19
收藏 1
点赞 0
评论 0

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
粉丝 73
博文 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
集合——Vector和ArrayList的比较

今天研究了一下Vector和ArrayList的源码,又加深了对这两个类的理解。 List接口下一共实现了三个类:ArrayList,Vector,LinkedList。LinkedList就不多说了,它一般主要用在保持数据的插入顺...

亚特兰缇斯
2015/03/16
0
0
JDK容器学习之CopyOnWriteArrayList:线程安全保障机制

JDK容器学习之CopyOnWriteArrayList 列表容器常见的有 和,然而两者都是非线程安全的,若应用场景对线程安全有需求,则可以使用来代替传统的 I. 存储结构 先看下类中定义的成员变量, 一个数组...

小灰灰Blog
2017/10/20
0
5
Java同步容器和并发容器

同步容器 Java常用的容器有ArrayList、LinkedList、HashMap等等,这些容器都是非线程安全的。 如果有多个线程并发地访问这些容器时,就会出现问题。 因此,在编写程序时,必须要求程序员手动...

泡海椒
2016/04/04
21
0
程序猿的日常——Java中的集合列表

列表对于日常开发来说实在是太常见了,以至于很多开发者习惯性的用到数组,就来一个ArrayList,根本不做过多的思考。其实列表里面还是有很多玩法的,有时候玩不好,搞出来bug还得定位半天。所...

青夜之衫
2017/12/05
0
0
ArrayList工作原理

1.前言 List接口中,重要的两个实现是ArrayList和LinkedList,其中ArrayList又比LinkedList常用。这是因为ArrayList的读取性能远远高于LinkedList。本篇博文将介绍ArrayList,稍后介绍Linke...

kukudeku
2016/08/26
137
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

tomcat虚拟路径的几种配置方法

tomcat虚拟路径的几种配置方法 一般我们都是直接引用webapps下面的web项目,如果我们要部署一个在其它地方的WEB项目,这就要在TOMCAT中设置虚拟路径了,Tomcat的加载web顺序是先加载 $Tomcat_ho...

Helios51
11分钟前
1
0
Mac 安装jupyter notebook的过程

MAC台式机 python:mac下自带Python 2.7.10 1.先升级了pip安装工具:sudo python -m pip install --upgrade --force pip 2.安装setuptools 工具:sudo pip install setuptools==33.1.1 3.安装......

火力全開
17分钟前
0
0
导航守卫解释与例子

“导航”表示路由正在发生改变。 正如其名,vue-router 提供的导航守卫主要用来通过跳转或取消的方式守卫导航。有多种机会植入路由导航过程中:全局的, 单个路由独享的, 或者组件级的。 记住...

tianyawhl
17分钟前
0
0
Java日志框架-logback配置文件多环境日志配置(开发、测试、生产)(原始解决方法)

说明:这种方式应该算是最通用的,原理是通过判断标签实现。 <!-- if-then form --> <if condition="some conditional expression"> <then> ... </then> </if> ......

浮躁的码农
31分钟前
1
0
FTP传输时的两种登录方式和区别

登录方式 匿名登录 用户名为: anonymous。 密码为:任何合法 email 地址。 授权登录 用户名为:用户在远程系统中的用户帐号。 密码为:用户在远程系统中的用户密码。 区别 匿名登录 只能访问...

寰宇01
32分钟前
0
0
plsql developer 配置监听(不安装oracle客户端)

plsql developer 配置监听(不安装oracle客户端)

微小宝
39分钟前
1
0
数据库(分库分表)中间件对比

本人的宗旨就是,能copy的,绝对不手写。 分区:对业务透明,分区只不过把存放数据的文件分成了许多小块,例如mysql中的一张表对应三个文件.MYD,MYI,frm。 根据一定的规则把数据文件(MYD)和索...

奔跑吧代码
43分钟前
2
0
Netty与Reactor模式详解

在学习Reactor模式之前,我们需要对“I/O的四种模型”以及“什么是I/O多路复用”进行简单的介绍,因为Reactor是一个使用了同步非阻塞的I/O多路复用机制的模式。 I/O的四种模型 I/0 操作 主要...

hutaishi
49分钟前
1
0
【2018.07.16学习笔记】【linux高级知识 20.16-20.19】

20.16/20.17 shell中的函数 20.18 shell中的数组 20.19 告警系统需求分析

lgsxp
55分钟前
0
0
用 D3.js 画一个手机专利关系图, 看看苹果,三星,微软间的专利纠葛

用 D3.js 画一个手机专利关系图, 看看苹果,三星,微软间的专利纠葛 前言 本文灵感来源于Mike Bostock 的一个 demo 页面 原 demo 基于 D3.js v3 开发, 笔者将其使用 D3.js v5 进行重写, 并改为...

ssthouse_hust
59分钟前
23
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部