Java高频面试之集合-07

hello啊,各位观众姥爷们!!!本baby今天来报道了!哈哈哈哈哈嗝🐶

面试官:ArrayList 和 Vector 的区别是什么?


ArrayList 与 Vector 的区别详解

ArrayListVector 都是 Java 中基于动态数组实现的 List 接口的实现类,但它们在设计、性能和线程安全性上有显著差异。以下是两者的核心区别:


1. 线程安全性
特性ArrayListVector
线程安全非线程安全(方法未同步)线程安全(方法通过 synchronized 同步)
适用场景单线程环境,性能优先多线程环境(但实际开发中不推荐)

示例对比

// ArrayList(非线程安全)
List<String> arrayList = new ArrayList<>();
arrayList.add("A"); // 多线程并发 add() 可能导致数据覆盖或异常// Vector(线程安全)
List<String> vector = new Vector<>();
vector.add("A");    // 内部使用 synchronized 同步,保证线程安全

2. 扩容机制
特性ArrayListVector
默认容量1010
扩容公式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. 性能差异
操作ArrayListVector
单线程读写更快(无同步开销)较慢(同步方法导致性能损耗)
多线程读写需手动同步(如使用 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. 历史与设计
特性ArrayListVector
引入版本JDK 1.2(集合框架的一部分)JDK 1.0(遗留类)
设计目标替代 Vector,优化单线程性能早期多线程支持
方法扩展支持现代集合操作(如 forEach保留旧方法(如 addElement

5. 迭代器行为
特性ArrayListVector
迭代器快速失败(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());}
}

总结与选型建议

  1. 单线程环境
    • 优先使用 ArrayList(性能更高,内存更优)。
  2. 多线程环境
    • 避免使用 Vector(性能差,锁粒度粗)。
    • 替代方案:
      • Collections.synchronizedList(new ArrayList<>())(灵活控制同步范围)。
      • CopyOnWriteArrayList(读多写少场景)。
  3. 历史代码兼容
    • 仅在维护旧系统时使用 Vector。

为什么 Vector 已被弃用?

  • 锁粒度过大:所有方法同步导致高并发时性能差。
  • 功能冗余:现代集合框架(如 java.util.concurrent)提供更高效的线程安全类。
  • 设计陈旧:未充分利用现代 JVM 优化(如 CAS 操作)。

代码示例:替代 Vector 的方案

// 方案1:使用同步包装类
List<String> syncList = Collections.synchronizedList(new ArrayList<>());// 方案2:使用并发集合类
CopyOnWriteArrayList<String> cowList = new CopyOnWriteArrayList<>();

结论ArrayList 是更现代、更高效的选择,Vector 仅用于兼容旧代码或特定场景的简单多线程需求。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/30359.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

《原型链的故事:JavaScript 对象模型的秘密》

原型链&#xff08;Prototype Chain&#xff09; 是 JavaScript 中实现继承的核心机制。每个对象都有一个内部属性 [[Prototype]]&#xff08;可以通过 __proto__ 访问&#xff09;&#xff0c;指向其原型对象。每个对象都有一个原型&#xff0c; 原型本身也是一个对象&#xf…

第11章 web应用程序安全(网络安全防御实战--蓝军武器库)

网络安全防御实战--蓝军武器库是2020年出版的&#xff0c;已经过去3年时间了&#xff0c;最近利用闲暇时间&#xff0c;抓紧吸收&#xff0c;总的来说&#xff0c;第11章开始学习利用web应用程序安全&#xff0c;主要讲信息收集、dns以及burpsuite&#xff0c;现在的资产测绘也…

【redis】全局命令set、get、keys

生产环境 未来在工作中会涉及到的几个环境&#xff1a; 办公环境&#xff08;入职后&#xff0c;公司给你发个电脑&#xff09;开发环境 有的时候&#xff0c;开发环境和办公环境是一个&#xff08;一般做前端和做客户端&#xff09;有的时候&#xff0c;开发环境是一个单独的…

Paper Reading | AI 数据库融合经典论文回顾

人工智能&#xff08;AI&#xff09;和数据库&#xff08;DB&#xff09;在过去的50年里得到了广泛的研究&#xff0c;随着数据库近年来的不断发展&#xff0c;数据库开始与人工智能结合&#xff0c;数据库和人工智能&#xff08;AI&#xff09;可以相互促进。一方面&#xff0…

Linux上位机开发(开篇)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 传统的上位机开发&#xff0c;一般都是默认pc软件开发。既然是pc软件&#xff0c;一般来说都是基于windows平台开发。开放的框架&#xff0c;无非是…

最长递增子序列--蓝桥oj3046拍照

题目链接 arr[] 1700 1701 1702 1703 1704 1705 dp1[] 1 2 3 4 5 6 dp2[] 6 5 4 3 2 1 sum[]dp1[]dp2[] sum[] 7 7 7 7 7 7 7是最大的倒叙和正序的…

upload-labs文件上传

第一关 上传一个1.jpg的文件&#xff0c;在里面写好一句webshell 保留一个数据包&#xff0c;将其中截获的1.jpg改为1.php后重新发送 可以看到&#xff0c;已经成功上传 第二关 写一个webshell如图&#xff0c;为2.php 第二关在过滤tpye的属性&#xff0c;在上传2.php后使用b…

LeetCode1137 第N个泰波那契数

泰波那契数列求解&#xff1a;从递归到迭代的优化之路 在算法的世界里&#xff0c;数列问题常常是我们锻炼思维、提升编程能力的重要途径。今天&#xff0c;让我们一同深入探讨泰波那契数列这一有趣的话题。 泰波那契数列的定义 泰波那契序列 Tn 有着独特的定义方式&#xf…

OpenCV 拆分、合并图像通道方法及复现

视频讲解 OpenCV 拆分、合并图像通道方法及复现 环境准备&#xff1a;安装 OpenCV 库&#xff08;pip install opencv-python&#xff09; 内容&#xff1a; 1. 读取任意图片&#xff08;支持 jpg/png 等格式&#xff09; 2. 使用 split () 函数拆解成 3 个单色通道&#xf…

【ArcGIS】地理坐标系

文章目录 一、坐标系理论体系深度解析1.1 地球形态的数学表达演进史1.1.1 地球曲率的认知变化1.1.2 参考椭球体参数对比表 1.2 地理坐标系的三维密码1.2.1 经纬度的本质1.2.2 大地基准面&#xff08;Datum&#xff09;的奥秘 1.3 投影坐标系&#xff1a;平面世界的诞生1.3.1 投…

登录固定账号和密码:

接口文档 【apifox】面试宝典 个人中心-保存用户数据信息 - 教学练测项目-面试宝典-鸿蒙 登录固定账号和密码&#xff1a; 账号&#xff1a;hmheima 密码&#xff1a;Hmheima%123 UI设计稿 【腾讯 CoDesign】面试宝典 CoDesign - 腾讯自研设计协作平台 访问密码&#xff1…

软件测试的基础入门(二)

文章目录 一、软件&#xff08;开发&#xff09;的生命周期什么是生命周期软件&#xff08;开发&#xff09;的生命周期需求分析计划设计编码测试运行维护 二、常见的开发模型瀑布模型流程优点缺点适应的场景 螺旋模型流程优点缺点适应的场景 增量模型和迭代模型流程适应的场景…

大模型架构记录2

一 应用场景 1.1 prompt 示例 1.2 自己搭建一个UI界面&#xff0c;调用接口 可以选用不同的模型&#xff0c;需要对应的API KEY 二 Agent 使用 2.1 构建GPT

PQL查询和监控各类中间件

1 prometheus的PQL查询 1.1 Metrics数据介绍 prometheus监控中采集过来的数据统一称为Metrics数据&#xff0c;其并不是代表具体的数据格式&#xff0c;而是一种统计度量计算单位当需要为某个系统或者某个服务做监控时&#xff0c;就需要使用到 metrics prometheus支持的met…

maven学习

Maven 概述 Maven 是一个基于 POM&#xff08;Project Object Model&#xff0c;项目对象模型&#xff09; 的项目管理和构建工具&#xff0c;主要用于 Java 项目。它通过一个中央信息管理模型&#xff08;POM 文件&#xff09;来管理项目的构建、依赖、文档、报告等。Maven 的…

STM32-I2C通信外设

目录 一&#xff1a;I2C外设简介 二&#xff1a;I2C外设数据收发 三&#xff1a;I2C的复用端口 四&#xff1a;主机发送和接收 五&#xff1a;硬件I2C读写MPU6050 相关函数&#xff1a; 1.I2C_ GenerateSTART 2.I2C_ GenerateSTOP 3.I2C_ AcknowledgeConfig 4.I2C…

c语言程序设计--(数据的存储)冲刺考研复试面试简答题,看看我是怎么回答的吧!!!!!

目录 1、整型在内存中的存储是怎样的&#xff1f; 2、原码反码补码的计算方式是什么&#xff1f; 3、对于整形数据在内存中存的都是二进制补码是为什么&#xff1f; 2、什么是大端小端存储&#xff1f; 3、为什么要有大端和小端的存储方式呢&#xff1f; 1、整型在内存中的…

记录小白使用 Cursor 开发第一个微信小程序(二):创建项目、编译、预览、发布(250308)

文章目录 记录小白使用 Cursor 开发第一个微信小程序&#xff08;二&#xff09;&#xff1a;创建项目、编译、预览、发布&#xff08;250308&#xff09;一、创建项目1.1 生成提示词1.2 生成代码 二、编译预览2.1 导入项目2.2 编译预览 三、发布3.1 在微信开发者工具进行上传3…

Java 大视界 -- 基于 Java 的大数据实时数据处理框架性能评测与选型建议(121)

&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎来到 青云交的博客&#xff01;能与诸位在此相逢&#xff0c;我倍感荣幸。在这飞速更迭的时代&#xff0c;我们都渴望一方心灵净土&#xff0c;而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识&#xff0c;也…

MySQL索引数据结构

目录 1 索引常用的数据结构 1.1 二叉树 1.2 平衡二叉树 1.3 红黑树 1.3 Hash表 1.4 B树 1.4 B树 2 MySQL索引的数据结构 2.1 MyISAM存储引擎索引 2.2 InnoDB存储引擎索引 2.2.1 聚集索引 2.2.2 非聚集索引 2.2.3 联合索引数 2.2.4 hash索引 1 索引常用的数据结构 1.1 二叉树 二…