Java高频面试之集合-07
hello啊,各位观众姥爷们!!!本baby今天来报道了!哈哈哈哈哈嗝🐶
面试官:ArrayList 和 Vector 的区别是什么?
ArrayList 与 Vector 的区别详解
ArrayList 和 Vector 都是 Java 中基于动态数组实现的 List 接口的实现类,但它们在设计、性能和线程安全性上有显著差异。以下是两者的核心区别:
1. 线程安全性
| 特性 | ArrayList | Vector |
|---|---|---|
| 线程安全 | 非线程安全(方法未同步) | 线程安全(方法通过 synchronized 同步) |
| 适用场景 | 单线程环境,性能优先 | 多线程环境(但实际开发中不推荐) |
示例对比:
// ArrayList(非线程安全)
List<String> arrayList = new ArrayList<>();
arrayList.add("A"); // 多线程并发 add() 可能导致数据覆盖或异常// Vector(线程安全)
List<String> vector = new Vector<>();
vector.add("A"); // 内部使用 synchronized 同步,保证线程安全
2. 扩容机制
| 特性 | ArrayList | Vector |
|---|---|---|
| 默认容量 | 10 | 10 |
| 扩容公式 | 1.5 倍(newCapacity = oldCapacity + (oldCapacity >> 1)) | 2 倍(newCapacity = oldCapacity * 2) |
| 性能影响 | 内存利用率较高,但扩容次数可能较多 | 扩容次数较少,但内存浪费较多 |
代码示例:
// ArrayList 扩容逻辑
int newCapacity = oldCapacity + (oldCapacity >> 1);// Vector 扩容逻辑(可自定义增长因子)
int newCapacity = oldCapacity + ((capacityIncrement > 0) ? capacityIncrement : oldCapacity);
3. 性能差异
| 操作 | ArrayList | Vector |
|---|---|---|
| 单线程读写 | 更快(无同步开销) | 较慢(同步方法导致性能损耗) |
| 多线程读写 | 需手动同步(如使用 Collections.synchronizedList) | 自动同步,但锁竞争可能成为瓶颈 |
基准测试示例(单线程添加 100 万元素):
// ArrayList 耗时 ≈ 50ms
List<Integer> list = new ArrayList<>();
for (int i = 0; i < 1_000_000; i++) {list.add(i);
}// Vector 耗时 ≈ 150ms(因同步开销)
List<Integer> vector = new Vector<>();
for (int i = 0; i < 1_000_000; i++) {vector.add(i);
}
4. 历史与设计
| 特性 | ArrayList | Vector |
|---|---|---|
| 引入版本 | JDK 1.2(集合框架的一部分) | JDK 1.0(遗留类) |
| 设计目标 | 替代 Vector,优化单线程性能 | 早期多线程支持 |
| 方法扩展 | 支持现代集合操作(如 forEach) | 保留旧方法(如 addElement) |
5. 迭代器行为
| 特性 | ArrayList | Vector |
|---|---|---|
| 迭代器 | 快速失败(Fail-Fast) | 快速失败(Fail-Fast) |
| 同步要求 | 多线程迭代需手动同步 | 自动同步(但迭代仍需外部同步) |
示例:
// ArrayList 迭代需手动同步
List<String> list = Collections.synchronizedList(new ArrayList<>());
synchronized (list) {Iterator<String> it = list.iterator();while (it.hasNext()) {System.out.println(it.next());}
}// Vector 迭代仍需同步(避免 ConcurrentModificationException)
Vector<String> vector = new Vector<>();
synchronized (vector) {Iterator<String> it = vector.iterator();while (it.hasNext()) {System.out.println(it.next());}
}
总结与选型建议
- 单线程环境:
- 优先使用 ArrayList(性能更高,内存更优)。
- 多线程环境:
- 避免使用 Vector(性能差,锁粒度粗)。
- 替代方案:
Collections.synchronizedList(new ArrayList<>())(灵活控制同步范围)。CopyOnWriteArrayList(读多写少场景)。
- 历史代码兼容:
- 仅在维护旧系统时使用 Vector。
为什么 Vector 已被弃用?
- 锁粒度过大:所有方法同步导致高并发时性能差。
- 功能冗余:现代集合框架(如
java.util.concurrent)提供更高效的线程安全类。 - 设计陈旧:未充分利用现代 JVM 优化(如 CAS 操作)。
代码示例:替代 Vector 的方案
// 方案1:使用同步包装类
List<String> syncList = Collections.synchronizedList(new ArrayList<>());// 方案2:使用并发集合类
CopyOnWriteArrayList<String> cowList = new CopyOnWriteArrayList<>();
结论:ArrayList 是更现代、更高效的选择,Vector 仅用于兼容旧代码或特定场景的简单多线程需求。

相关文章:
Java高频面试之集合-07
hello啊,各位观众姥爷们!!!本baby今天来报道了!哈哈哈哈哈嗝🐶 面试官:ArrayList 和 Vector 的区别是什么? ArrayList 与 Vector 的区别详解 ArrayList 和 Vector 都是 Java 中基于…...
Redis- 切片集群
切片集群 切片集群什么是Redis Cluster吗?为什么需要切片集群?Redis Cluster的数据分片机制是怎样的?哈希槽的算法是什么基本算法流程 待填坑 切片集群 什么是Redis Cluster吗?为什么需要切片集群? Redis Cluster是R…...
【项目日记(十)】瓶颈分析与使用基数树优化
前言 上一期我们对整个项目进行了细节部分的优化,并在最后测试了多线程环境下和malloc的性能对比测试,发现malloc有时候还是更胜一筹的,基于此我们进行对我们的内存池进行瓶颈分析与优化。 目录 前言 一、项目瓶颈分析 VS编译器下性能分…...
后台管理系统比较全面的分析对比
以下是主流的 后台管理系统模板 分类与技术选型指南,涵盖开源、商业及全栈解决方案,可根据项目需求灵活选择: 一、开源免费模板 1. React 技术栈 Ant Design Pro 官网:pro.ant.design特点:阿里出品,内置 R…...
HCIA复习拓扑实验
一.拓扑图 二.需求 1.学校内部的HTTP客户端可以正常通过域名www.baidu.com访问到百度网络中HTTP服务器 2.学校网络内部网段基于192.168.1.0/24划分,PC1可以正常访问3.3.3.0/24网段,但是PC2不允许 3.学校内部路由使用静态路由,R1和R2之间两…...
TI毫米波雷达开发 —— 串口输出数据解析
TI毫米波雷达开发 —— 串口输出解析 TLV协议协议概述HeaderBodyPadding TI 毫米波雷达芯片计算的结果数据都会从UART发出供上位机进行解析并展示。解析和展示是两个不同的概念,解析指提取有效数据并转换成常见的度量值。展示指数据的可视化。 由于雷达这个领域的特…...
Docker Desktop 4.38 安装与配置全流程指南(Windows平台)
一、软件定位与特性 Docker Desktop 是容器化应用开发与部署的一体化工具,支持在本地环境创建、管理和运行Docker容器。4.38版本新增GPU加速支持、WSL 2性能优化和Kubernetes 1.28集群管理功能,适用于微服务开发、CI/CD流水线搭建等场景。 二、安装环境…...
【AD】5-16 泪滴的添加
1.工具—滴泪(快捷键TE)...
聊天服务器分布式改造
目前的聊天室是单节点的,无论是http接口还是socket接口都在同一个进程,无法承受太多人同时在线,容灾性也非常差。因此,一个成熟的IM产品一定是做成分布式的,根据功能分模块,每个模块也使用多个节点并行部署…...
el-table(elementui)表格合计行使用以及滚动条默认样式修改
一、el-table新增合计行以及el-table展示数据出现的问题 1. 使用合计行 el-table的属性show-summary设为true,即可在表格尾部展示合计行。默认情况下,第一列不展示数据,而显示合计二字,可以通过sum-text自己配置,其余…...
Web前端开发——HTML基础下
HTML语法 一表格1.基本格式2.美化表格合并居中属性 二表单1.input2.select3.textarea4.button5.date6.color7.checkbox8.radio9.range10.number 一表格 1.基本格式 HTML表格由<table>标签定义 其中行由<tr>标签定义,单元格由<td>定义。我们先来…...
Python使用入门(一)
初识数据类型 整型(int) print(666) print(2 10) print(2 * 12)字符串(str) 单行字符串 #单行字符串 print("我是小红aaa") print(我是小红aaa)print("中国上海") print(中国上海)# 输出带引号的字符串 print(我是"小红aaa) print("我是\&qu…...
基于multisim的花样彩灯循环控制电路设计与仿真
1 课程设计的任务与要求 (一)、设计内容: 设计一个8路移存型彩灯控制器,基本要求: 1. 8路彩灯能演示至少三种花型(花型自拟); 2. 彩灯用发光二极管LED模拟; 3. 选做…...
求最大公约数【C/C++】
大家好啊,欢迎来到本博客( •̀ ω •́ )✧,我将带领大家详细的了解最大公约数的思想与解法。 一、什么是公约数 公约数,也称为公因数,是指两个或多个整数共有的因数。具体来说,如果一个整数能被两个或多个整数整除&…...
leetcode day27 455+376
455 分发饼干 假设你是一位很棒的家长,想要给你的孩子们一些小饼干。但是,每个孩子最多只能给一块饼干。 对每个孩子 i,都有一个胃口值 g[i],这是能让孩子们满足胃口的饼干的最小尺寸;并且每块饼干 j,都有…...
go的grpc
GRPC介绍 目录 单体架构微服务架构问题原始的grpc 服务端客户端原生rpc的问题 grpc的hello world 服务端客户端 proto文件proto语法 数据类型 基本数据类型其他数据类型 编写风格多服务 单体架构 只能对整体扩容一荣俱荣,一损俱损代码耦合,项目的开…...
算法每日一练 (9)
💢欢迎来到张胤尘的技术站 💥技术如江河,汇聚众志成。代码似星辰,照亮行征程。开源精神长,传承永不忘。携手共前行,未来更辉煌💥 文章目录 算法每日一练 (9)最小路径和题目描述解题思路解题代码…...
软考高级信息系统项目管理师笔记-第10章项目进度管理
第10章项目进度管理 10.1 管理基础 10.1.1 项目进度计划的定义和总要求 1、项目进度计划是 一种用于沟通和管理干系人期望的工具,为绩效报告提供依据。 2、项目管理团队编制进度计划的一般步骤为: 首先选择进度计划方法,例如关键路径法; 然后将项目特定数据,如活动、计…...
专门为高速连续扫描设计的TDI工业相机
TDI(Time Delay Integration,时间延迟积分)工业相机是一种基于特殊CCD(电荷耦合器件)技术的成像设备,主要用于高速、高灵敏度、高分辨率的图像采集场景。其核心原理是通过多级积分和同步电荷转移技术&#…...
【Vue3】实现一个超过高度后可控制显示隐藏的组件
组件效果图 未达到最大高度 达到设置的最大高度 进行展开 实现代码 组件代码 备注:通过tailwindcss设置的样式,通过element-plus/icons-vue设置的图标,可根据情况进行替换 <template><!-- 限制高度组件 --><div ref"…...
DriverStore Explorer:释放磁盘空间的开源驱动管理工具
DriverStore Explorer:释放磁盘空间的开源驱动管理工具 【免费下载链接】DriverStoreExplorer Driver Store Explorer [RAPR] 项目地址: https://gitcode.com/gh_mirrors/dr/DriverStoreExplorer 1. 诊断驱动膨胀:3个隐藏原因解析 你的C盘空间是…...
EVA-01保姆级教程:Qwen2.5-VL-7B多模态大模型在EVA-01中的本地化安全部署
EVA-01保姆级教程:Qwen2.5-VL-7B多模态大模型在EVA-01中的本地化安全部署 1. 引言:欢迎来到NERV指挥中心 想象一下,你面前有一个能看懂图片、理解图表、甚至能和你讨论图片里发生了什么的智能助手。现在,我们把这个助手装进了一…...
AI辅助开发:用提示词让快马AI自动生成技术职级成长路径分析应用
AI辅助开发:用提示词让快马AI自动生成技术职级成长路径分析应用 最近在研究技术职级体系时,发现很多开发者对阿里P10这类高级职位的成长路径特别感兴趣。但手动整理这些信息费时费力,于是尝试用AI辅助开发的方式快速生成一个可视化分析工具。…...
ArcGIS字段值提取:别再手动截取了,用Python和VB脚本5分钟搞定
ArcGIS字段值提取:Python与VB脚本高效自动化方案 引言:告别低效手工操作 在GIS数据处理工作中,属性表字段值的提取是再常见不过的操作。想象一下这样的场景:你手头有一份包含数万条记录的行政区划数据,需要从"BSM…...
避开这些坑!医疗内窥镜Zemax优化时的高温灭菌与弯曲成像难题解决指南
医疗内窥镜光学系统设计实战:高温灭菌与弯曲成像的Zemax解决方案 在微创手术和工业检测领域,直径仅2.8mm的医疗内窥镜需要同时满足140广角视场、F2.0大光圈和10μm高分辨率的要求。更严峻的挑战来自使用环境——必须耐受135℃高温蒸汽灭菌,并…...
工业质检避坑指南:手把手教你根据数据成本选择异常检测模型(RGB/PCD/多模态实战)
工业质检实战:如何基于数据成本选择最优异常检测方案 在工业质检领域,算法工程师常面临一个现实困境:实验室里刷榜的模型往往需要昂贵的数据采集设备,而工厂产线上可能只有最基础的RGB相机。我曾参与过多个工业质检项目࿰…...
超越单一工具:在快马平台探索多模型ai辅助开发的全新工作流
在开发过程中,AI辅助工具已经逐渐成为提升效率的利器。最近我在尝试使用InsCode(快马)平台时,发现它提供的多模型AI辅助开发能力,远比单一工具更加强大和灵活。下面分享一个我实践的综合示例项目,展示如何利用平台的多模型能力优化…...
时间切片:24小时
基于双层优化的电动汽车优化调度研究 代码主要做的是一个双层的电动汽车充放电行为优化问题,具体来讲,输电网上层优化将电动汽车与发电机、基本负荷协调,同时考虑风力发电,从而在时域内优化电动汽车的负荷周期。 然后,…...
麒麟V10系统下国产海量数据库安装全攻略(含内核参数优化与避坑指南)
麒麟V10系统下国产海量数据库安装全攻略(含内核参数优化与避坑指南) 在国产化技术快速发展的今天,越来越多的企业和机构开始采用国产操作系统和数据库产品。麒麟V10作为国产操作系统的代表之一,其稳定性和安全性得到了广泛认可。而…...
别死记硬背了!用Python的NumPy库,5分钟搞定线性代数里的矩阵运算(附代码)
用Python的NumPy库轻松玩转线性代数:矩阵运算实战指南 线性代数作为现代科学与工程的基石,在机器学习、计算机图形学、量化金融等领域无处不在。但传统教材中抽象的数学符号和繁琐的手工计算,往往让学习者望而生畏。今天,我们将用…...
