JDK容器学习之List: CopyOnWriteArrayList,ArrayList,LinkedList对比
时间:2022-04-27
本文章向大家介绍JDK容器学习之List: CopyOnWriteArrayList,ArrayList,LinkedList对比,主要内容包括列表、简述、2. 底层存储、3. 使用场景和说明、4. 特性、基本概念、基础应用、原理机制和需要注意的事项等,并结合实例形式分析了其使用技巧,希望通过本文能帮助到大家理解应用这部分内容。
列表
List, ArrayList, LinkedList, CopyOnWriteArrayList, Vector
简述
1. 列表划分为线程安全和线程非安全两类
线程安全: Vector
, CopyOnWriteArrayList
, Collections.synchronizedList()
线程非安全:ArrayList
, LinkedList
2. 底层存储
数组:
ArrayList
Vecotr
CopyOnWriteArrayList
双向链表:LinkedList
通过三个添加元素的过程图,来看数据结构
ArrayList,Vector : 底层存储为数组
LinkedList : 底层存储为双向链表
CopyArrayList:底层存储为数组
3. 使用场景和说明
ArrayList
- 底层为数组,适合随机访问
- 删除不会引起数组容量变小
- 动态插入可能涉及到数组长度重新分配
- 为避免频繁的数组扩容,可设置一个合适的初始容量
- 不适用于频繁的在数组中间进行插入删除的场景
LinkedList
- 底层为双向链表,适合频繁删除新增的场景
- 随机访问不友好,需要遍历
Vector
- 线程安全
- 所有的方法都加锁,导致性能较差
CopyOnWriteArrayList
- 线程安全
- 读方法不加锁;修改方法加锁,一次只能一个写线程访问
- 修改时,会拷贝一份内容出来,对拷贝的结果进行操作,最后覆盖之前的内容
- 遍历和读取都是基于访问时刻列表中的数组进行的;在执行过程中,链表发生修改不会影响遍历和读取的结果(即此时访问的依然是原数组内容)
4. 特性
-
List
是有序的 -
ArrayList
默认容量为10;LinkedList
,CopyOnWriteArrayList
默认容量为0 -
new ArrayList<>()
内部的数组实际上引用的是一个空数组 -
ArrayList
扩容规则- 增加原来空间大小的一半
- 如果依然塞不下,则扩充到正好填充满的情况
- 排序
Collections.sort(list, new Comparator(){xxx})
- 若List中的元素,实现了
Comparater
接口后,可以直接调用Collections.sort(list);
- 需要线程安全的场景,使用
CopyOnWriteArrayList
或Collections.synchronizedList
来替代Vector
- Python时间运算的详细机制初探讨
- C++编译错误cannot have cv-qualifier
- Python写TCP端口扫描工具之IP协议的讲解
- mac上nginx+jetty负载均衡部署一览
- Python标准库(1) — itertools模块
- C++从键盘输入文件结束符
- java cpu高达100%问题 排查
- (43) 剖析TreeMap / 计算机程序的思维逻辑
- Spring Cloud第一篇 Eureka简介及原理
- 华为面试题——约瑟夫问题的C++简单实现(循环链表)
- (49) 剖析LinkedHashMap / 计算机程序的思维逻辑
- Python多进程并行编程实践-mpi4py的使用
- 华为面试题——一道关于指针方面的编程题(C/C++)
- Spring Cloud第二篇 创建一个Eureka Server
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法