博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JDK容器学习之List: CopyOnWriteArrayList,ArrayList,LinkedList对比
阅读量:6891 次
发布时间:2019-06-27

本文共 1073 字,大约阅读时间需要 3 分钟。

hot3.png

列表

List, ArrayList, LinkedList, CopyOnWriteArrayList, Vector

简述

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

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

线程非安全:ArrayList, LinkedList


2. 底层存储

数组: ArrayList Vecotr CopyOnWriteArrayList

双向链表:LinkedList

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

ArrayList,Vector : 底层存储为数组

addRemove

LinkedList : 底层存储为双向链表

add

CopyArrayList:底层存储为数组

add


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);
  • 需要线程安全的场景,使用 CopyOnWriteArrayListCollections.synchronizedList 来替代 Vector

扫描关注,java分享

转载于:https://my.oschina.net/u/566591/blog/1554353

你可能感兴趣的文章
AutoCAD快捷键大全
查看>>
两款公式编辑器
查看>>
Cocos2dx——HelloWorld相关
查看>>
我的友情链接
查看>>
Eclipse的SVN插件与SVN客户端安装版本一致性,实现版本协同管理
查看>>
openstack dashboard 加载慢的原因
查看>>
Windows Server 2008 中直接安装Microsoft .NET Framework 3.5 sp1
查看>>
VS2010与.NET4.0 系列 2. 项目入门模板
查看>>
MySQL的存储引擎比较
查看>>
关于硬盘读写
查看>>
基于TCP协议的Socket通信
查看>>
IReport安装完无法启动
查看>>
C二级指针内存模型一
查看>>
如何关掉vmware虚拟机中的redhat和windows 2003的报警声
查看>>
我的友情链接
查看>>
双向链表实现约瑟夫双向生死游戏
查看>>
Java知识点06-原码、反码、补码
查看>>
求职之路
查看>>
Spring Cloud Alibaba迁移指南2:一行代码从Hystrix迁移到Sentinel
查看>>
客户端无法退出AD域控,无法修改计算机名字(服务器上的安全数据没有此工作站信任关系的计算机账户!)...
查看>>