面试题-List之ArrayList、Vector、SynchronizedList、CopyOnWriteArrayList
时间:2022-07-24
本文章向大家介绍面试题-List之ArrayList、Vector、SynchronizedList、CopyOnWriteArrayList,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
容器中的List在我们日常开发中,比较常用,而且也是面试的必考题,下面我们来说下List家族的各种实现;
1.ArrayList
ArrayList底层是数组实现,顺序插入,可以通过下标查找元素,速度很快,插入和删除元素很慢,非线程安全,比如在多线层的情况下add(),会出现覆盖情况;
容易出现问题的地方在于,elementData[size++] = e;首先把元素赋值给数组,然后长度增加,当两个线程同时增加元素时,线程1拿到时间片赋值elementData[size] = 1,执行后失去时间片,线程2获得时间片,elementData[size] = 2,这样线程1的值就被线程给覆盖了,长度两次增加变成2,实际上第2个值是null,这样就出现了问题;同时遍历时需改也存在java.util.ConcurrentModificationException异常;
2.Vector Vector底层也是数组,它和ArrayList的区别在于add、set、get方等法上都加了synchronized关键字,这样就保证了多线程下的线程安全问题,但是效率不如ArrayList;
3.SynchronizedList SynchronizedList是容器工具包提供的包装同步类,List<String> stringList = Collections.synchronizedList(list);看下面的代码,他在set、get等方法内部加了同步代码块,synchronized (mutex) 锁住了传入的对象,但是效率没有太大的改变。
4.CopyOnWriteArrayList
CopyOnWriteArrayList是今天的主角,它是一个实现读写分离的容器,add时通过一个非公平锁加锁,然后复制现有数组为一个新的数组,再把新加入的元素添加到新数组中,把数组指针指向新数组,这样写输入保证了线程安全问题,使用可重入锁的非公平锁效率很高,读数据的时候,读现有的数组,不用加锁,效率提升很多,缺点是每次写入都要复制一个新的数组,会造成内存浪费,垃圾回收频繁等,适合读多写少的场景。
- ZooKeeper 笔记(1) 安装部署及hello world
- mybatis 使用经验小结
- ZooKeeper 笔记(2) 监听数据变化
- 使用C# 和Consul进行分布式系统协调
- 设置 java -jar 的进程显示名称
- 爱浪携手豆瓣内容、腾讯共同发布AI语音耳机
- Win.ini和注册表的读取写入
- ZooKeeper 笔记(4) 实战应用之【消除单点故障】
- 64位centos 下编译 hadoop 2.6.0 源码
- Python基础原理:FP-growth算法的构建
- MFC中如何画带实心箭头的直线
- 非域环境下使用证书设置数据库镜像
- velocity模板引擎学习(3)-异常处理
- Oracle Coherence应用部署到Jboss EAP 6.x 时 NoClassDefFoundError: sun/rmi/server/MarshalOutputStream 的解决办法
- 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 数组属性和方法
- 基于docker部署skywalking实现全链路监控
- 数据结构与算法(二)——十大排序算法
- VUE项目使用.env文件配置全局环境变量
- 设计模式学习(六)-抽象工厂模式
- 彻底完美解决安卓苹果手机点击输入框网页页面自动放大缩小
- 第22天:NLP实战(六)——基于PaddleHub的疫情期间网民情绪识别
- Echarts大数据可视化物流航向省份流向迁徙动态图,开发全解+完美参数注释
- Linux 常用操作以及概念
- GCD梳理与总结——封装
- 原生JS在网页上复制的所有文字后面自动加上一段版权声明
- 使用宝塔docker安装为知笔记私有部署
- 第4天:美团点评2020校招测试方向笔试试卷分析
- Element-UI饿了么时间组件控件按月份周日期,开始时间结束时间范围限制参数
- 微信小程序flex布局
- 细数 TS 中那些奇怪的符号