JDK容器学习之List: CopyOnWriteArrayList,ArrayList,LinkedList对比

列表

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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏一个会写诗的程序员的博客

FastJson中@JSONField注解使用FastJson中@JSONField注解使用

如果json格式数据不符合Java中的标准驼峰式变量定义规则,并且难以理解,这个时候就需要在后台中做二次处理,将数据处理成我们系统中定义的格式。

18230
来自专栏小灰灰

Java容器篇小结之List自问自答

I. List篇 0. 什么是List 看到这个有点懵逼,一时还真不知道怎么解释,能让完全没有接触过的人都能听懂 列表,什么是列表呢? 好比你到了一个村里,看...

22580
来自专栏计算机视觉与深度学习基础

Leetcode 215. Kth Largest Element in an Array

Find the kth largest element in an unsorted array. Note that it is the kth larg...

231100
来自专栏Android机动车

数据结构学习笔记——队列

线性表有顺序存储和链式存储,栈是线性表,所以有这两种存储方式。同样,队列作为一种特殊的线性表,也同样存在这两种存储方式。

6010
来自专栏LanceToBigData

Java集合源码分析(三)Vevtor和Stack

前言   前面写了一篇关于的是LinkedList的除了它的数据结构稍微有一点复杂之外,其他的都很好理解的。这一篇讲的可能大家在开发中很少去用到。但是有的时候也...

26360
来自专栏java达人

快速失败Vs安全失败(Java迭代器附示例)

译者:java达人-卍极客 英文出处:Java Concept Of The Day 英文链接:http://javaconceptoftheday.com/...

23970
来自专栏Java学习网

Java中三种Set类型用法、性能大比拼

Java为开发者提供了大量的工具类,这给开发人员带来了很大方便,但是选择多了也有困扰,究竟用哪个类;我想选择什么,一是看自己具体需求,二是类本身的性能和用法;J...

94860
来自专栏皮皮之路

【JDK1.8】JDK1.8集合源码阅读——Set汇总

324120
来自专栏阿杜的世界

Java并发-CopyOnWriteArrayList前言CopyOnWriteArrayList API例子1:插入(删除)数据的同时进行遍历例子2:不支持一边遍历一边删除结论参考资料

今天我们一起学习下java.util.concurrent并发包里的CopyOnWriteArrayList工具类。当有多个线程可能同时遍历、修改某个公共数组时...

16030
来自专栏一英里广度一英寸深度的学习

二叉树的深度优先遍历与广度优先遍历

先遍历子节点,再遍历兄弟节点。 从根节点开始递归,如果存在子节点,继续遍历子节点。

86830

扫码关注云+社区

领取腾讯云代金券