2024年150道高频Java面试题(二十二)
43. ArrayList 和 Vector 的区别是什么?
ArrayList 和 Vector 是 Java 中用于存储对象的两种不同类型的动态数组。它们都实现了 List
接口,但存在一些重要的区别:
- 同步性:
ArrayList
是不同步的,意味着它不是线程安全的。在进行迭代或者修改操作时,如果有多个线程访问同一个ArrayList
实例,必须外部同步。Vector
是同步的,它的所有公共方法都是同步方法,因此是线程安全的。任何时刻只有一个线程能够访问Vector
的任何同步方法。
- 性能:
- 由于
ArrayList
不需要考虑线程同步的问题,因此在单线程环境下它比Vector
更快。 Vector
的每个操作都可能涉及到锁定,这会在多线程环境中导致性能开销。
- 由于
- 容量增长:
ArrayList
和Vector
都会根据需要自动增长其内部数组的大小,但增长方式不同。ArrayList
的默认增长策略是增长当前容量的50%,而Vector
默认增长一倍。但是,Vector
允许通过构造函数设置增长系数,而ArrayList
不支持。
- 迭代器:
ArrayList
和Vector
都支持快速失败的迭代器,但这些迭代器在不同的列表结构上行为可能不同。如果在迭代过程中列表结构被修改(不是通过迭代器自己的remove
方法),ArrayList
的迭代器会立即抛出ConcurrentModificationException
,而Vector
的迭代器由于同步可能会在某个不确定的时间抛出异常。
- 遗留问题:
Vector
是 Java 早期版本中的类,那时候集合框架还没有出现。随着 Java Collections Framework 的引入,ArrayList
被推荐作为Vector
的替代品,因为它提供了更灵活的API和更好的性能。
以下是 ArrayList
和 Vector
的简单代码示例:
import java.util.ArrayList;
import java.util.Vector;public class ListExample {public static void main(String[] args) {// ArrayList 示例ArrayList<String> arrayList = new ArrayList<>();arrayList.add("Element 1");arrayList.add("Element 2");// ... 在这里不会有线程安全问题// Vector 示例Vector<String> vector = new Vector<>();vector.add("Element 1");vector.add("Element 2");// ... 在这里由于同步,多线程操作更安全}
}
总的来说,如果没有多线程的需求,推荐使用 ArrayList
,因为它更简单、更快。如果需要线程安全,可以考虑使用 Vector
或者通过 Collections.synchronizedList()
来包装一个 ArrayList
。
44. Array 和 ArrayList 有何区别?
Array(数组)和 ArrayList 是Java编程语言中两种不同的数据结构,用于存储元素集合,它们之间有以下主要区别:
- 类型:
- Array 可以是基本数据类型数组,也可以是对象数组,但一旦创建,其类型固定,长度也固定。
- ArrayList 是泛型类,属于集合框架的一部分,只能存储对象,不能存储基本数据类型,但可以存储任何类型的对象,因为使用了泛型。
- 大小可变性:
- Array 的大小在创建时就已经确定,之后不能改变。
- ArrayList 是动态的,可以根据需要自动调整其内部数组的大小。
- 性能:
- Array 由于其固定大小,通常在访问元素时性能稍快。
- ArrayList 由于涉及到动态扩容,在添加或删除元素时可能需要复制数组,性能相对较慢。
- 灵活性:
- Array 在处理大量数据时效率高,且占用内存固定,但是不够灵活。
- ArrayList 在处理小到中等数量的数据时非常灵活,因为它可以自动调整大小。
- 接口和方法:
- Array 是Java语言的内建数据结构,它没有提供额外的操作方法,仅提供基本的访问和修改元素的方法。
- ArrayList 实现了 List 接口,拥有丰富的接口方法,如 add(), remove(), set(), contains(), size(), isEmpty(), clear() 等。
- 迭代方式:
- Array 可以通过传统的for循环或者增强型for循环来迭代。
- ArrayList 可以通过增强型for循环、普通for循环、迭代器(Iterator)等多种方式迭代。
代码示例:
// 使用Array
int[] intArray = new int[10]; // 创建一个长度为10的整数数组
for (int i = 0; i < intArray.length; i++) {intArray[i] = i;
}// 使用ArrayList
ArrayList<Integer> integerArrayList = new ArrayList<>();
for (int i = 0; i < 10; i++) {integerArrayList.add(i);
}// ArrayList的迭代
for (Integer number : integerArrayList) {System.out.println(number);
}// Array和ArrayList的混用
Integer[] integerArray = integerArrayList.toArray(new Integer[0]); // 将ArrayList转换为Array
ArrayList<Integer> newArrayList = new ArrayList<>(Arrays.asList(intArray)); // 注意这里是将数组内容作为List初始化
总结来说,Array适用于已知大小和类型的场景,而ArrayList适用于元素数量不固定或需要频繁添加/删除元素的场景。
领【150 道精选 Java 高频面试题】请go公众号:码路向前 。
相关文章:
2024年150道高频Java面试题(二十二)
43. ArrayList 和 Vector 的区别是什么? ArrayList 和 Vector 是 Java 中用于存储对象的两种不同类型的动态数组。它们都实现了 List 接口,但存在一些重要的区别: 同步性: ArrayList 是不同步的,意味着它不是线程安全…...

如何使用校园网——Win10笔记本,台式机互开热点
当我们使用校园网的时候,往往只能连接一个电脑端,但是又想两个机子同时连接WIFI怎么办呢? 当然,前提条件是你先得其中一台电脑有网络哈 1、打开想开共享热点的电脑的设置 A、点击WIN,再点击设置 2、点击网络和Inte…...
c#:简洁实现if-else语句
c#:简洁实现if-else语句 在C#中,可以使用三元运算符(? :)来简洁地实现if-else语句。其语法格式为: 条件表达式 ? 表达式1 : 表达式2 例如:当条件表达式为真时,返回表达式1的值,否…...

金融贷款批准预测项目
注意:本文引用自专业人工智能社区Venus AI 更多AI知识请参考原站 ([www.aideeplearning.cn]) 在金融服务行业,贷款审批是一项关键任务,它不仅关系到资金的安全,还直接影响到金融机构的运营效率和风险管理…...

FR中隐藏系统管理--用户管理中 表格中每条数据中的编辑按钮,删除按钮
比如隐藏删除按钮: var userTableTools BI.Constants.getConstant("dec.constant.user.table.tools")for(var key in userTableTools){if(key "delete"){var deleteItem userTableTools["delete"]deleteItem.invisible true;}}...

函数重载和引用【C++】
文章目录 函数重载什么是函数重载?函数重载的作用使用函数重载的注意点为什么C可以函数重载,C语言不行? 引用什么是引用?引用的语法引用的特点引用的使用场景引用的底层实现传参时传引用和传值的效率引用和指针的区别 函数重载 什…...
rust-tokio发布考古
源头: Carl Lerche Aug 4, 2016 I’m very excited to announce a project that has been a long time in the making. 我很兴奋地宣布一个酝酿已久的项目。 Tokio is a network application framework for rapid development and highly scalable deployments…...

3D医疗图像配准 | 基于Vision-Transformer+Pytorch实现的3D医疗图像配准算法
项目应用场景 面向医疗图像配准场景,项目采用 Pytorch ViT 来实现,形态为 3D 医疗图像的配准。 项目效果 项目细节 > 具体参见项目 README.md (1) 模型架构 (2) Vision Transformer 架构 (3) 量化结果分析 项目获取 https://download.csdn.net/down…...
设计模式(18):状态模式
核心 用于解决系统中复杂对象的状态转换以及不同状态下行为的封装问题 结构 环境类(Context): 环境类中维护一个State对象,它定义了当前的状态,并委托当前状态处理一些请求; 抽象状态类(State): 用于封装对象的一个特定状态所对应的行为&a…...

如果用大模型考公,kimi、通义千问谁能考高分?
都说大模型要超越人类了,今天就试试让kimi和通义千问做公务员考试题目,谁能考高分? 测评结果再次让人震惊! 问题提干:大小两种规格的盒装鸡蛋,大盒装23个,小盒装16个,采购员小王买了…...
如何在Java中创建对象输入流
在Java中创建对象输入流(ObjectInputStream)通常涉及以下步骤: 获取源输入流:首先,你需要有一个源输入流,它可能来自文件、网络连接或其他任何可以提供字节序列的源。 包装源输入流:接着&#…...
Vue 打包或运行时报错Error: error:0308010C
问题描述: 报错:Error: error:0308010C 报错原因: 主要是因为 nodeJs V17 版本发布了 OpenSSL3.0 对算法和秘钥大小增加了更为严格的限制,nodeJs v17 之前版本没影响,但 V17 和之后版本会出现这个错误…...

222222222222222222222222
欢迎关注博主 Mindtechnist 或加入【Linux C/C/Python社区】一起学习和分享Linux、C、C、Python、Matlab,机器人运动控制、多机器人协作,智能优化算法,滤波估计、多传感器信息融合,机器学习,人工智能等相关领域的知识和…...

微信小程序 电影院售票选座票务系统5w7l6
uni-app框架:使用Vue.js开发跨平台应用的前端框架,编写一套代码,可编译到Android、小程序等平台。 框架支持:springboot/Ssm/thinkphp/django/flask/express均支持 前端开发:vue.js 可选语言:pythonjavanode.jsphp均支持 运行软件…...

C#:用定时器监控定时器,实现中止定时器正在执行的任务,并重启
Windows服务中使用的比较多的是定时器,但这种定时任务有个比较大的毛病:有时会莫名其妙地停止执行(长时间执行不完,假死),必须得手工重启Windows服务才能恢复正常。这个就太麻烦了。 有没有办法来实现定时…...

计算机组成原理 — CPU 的结构和功能
CPU 的结构和功能 CPU 的结构和功能CPU 概述控制器概述CPU 框架图CPU 寄存器控制单元 CU 指令周期概述指令周期的数据流 指令流水概述指令流水的原理影响流水线性能的因素流水线的性能流水线的多发技术流水线结构 中断系统概述中断请求标记和中断判优逻辑中断请求标记 INTR中断…...

npm包安装与管理:深入解析命令行工具的全方位操作指南,涵盖脚本执行与包发布流程
npm,全称为Node Package Manager,是专为JavaScript生态系统设计的软件包管理系统,尤其与Node.js平台紧密关联。作为Node.js的默认包管理工具,npm为开发者提供了便捷的方式来安装、共享、分发和管理代码模块。 npm作为JavaScript世…...
序列化结构(protobuf)实现一个TCP服务器(C++)
Protocol Buffers(protobuf)是一种由Google开发的用于序列化结构化数据的方法,通常用于在不同应用程序之间进行数据交换或存储数据。它是一种语言无关、平台无关、可扩展的机制,可以用于各种编程语言和环境中。 1、首先建立proto文…...

Python中的list()和map() 用法
list() 在Python中,list() 是一个内置函数,用于创建列表(list)对象。它有几个不同的用途,但最常见的是将一个可迭代对象(如元组、字符串、集合或其他列表)转换为一个新的列表。 以下是一些使用…...

公网环境下如何端口映射?
公网端口映射是一种网络技术,它允许将本地网络中的设备暴露在公共互联网上,以便能够从任何地方访问这些设备。通过公网端口映射,用户可以通过互联网直接访问和控制局域网中的设备,而无需在本地网络中进行复杂的配置。 公网端口映射…...
[2025CVPR]DeepVideo-R1:基于难度感知回归GRPO的视频强化微调框架详解
突破视频大语言模型推理瓶颈,在多个视频基准上实现SOTA性能 一、核心问题与创新亮点 1.1 GRPO在视频任务中的两大挑战 安全措施依赖问题 GRPO使用min和clip函数限制策略更新幅度,导致: 梯度抑制:当新旧策略差异过大时梯度消失收敛困难:策略无法充分优化# 传统GRPO的梯…...
基于大模型的 UI 自动化系统
基于大模型的 UI 自动化系统 下面是一个完整的 Python 系统,利用大模型实现智能 UI 自动化,结合计算机视觉和自然语言处理技术,实现"看屏操作"的能力。 系统架构设计 #mermaid-svg-2gn2GRvh5WCP2ktF {font-family:"trebuchet ms",verdana,arial,sans-…...

【WiFi帧结构】
文章目录 帧结构MAC头部管理帧 帧结构 Wi-Fi的帧分为三部分组成:MAC头部frame bodyFCS,其中MAC是固定格式的,frame body是可变长度。 MAC头部有frame control,duration,address1,address2,addre…...
QMC5883L的驱动
简介 本篇文章的代码已经上传到了github上面,开源代码 作为一个电子罗盘模块,我们可以通过I2C从中获取偏航角yaw,相对于六轴陀螺仪的yaw,qmc5883l几乎不会零飘并且成本较低。 参考资料 QMC5883L磁场传感器驱动 QMC5883L磁力计…...

理解 MCP 工作流:使用 Ollama 和 LangChain 构建本地 MCP 客户端
🌟 什么是 MCP? 模型控制协议 (MCP) 是一种创新的协议,旨在无缝连接 AI 模型与应用程序。 MCP 是一个开源协议,它标准化了我们的 LLM 应用程序连接所需工具和数据源并与之协作的方式。 可以把它想象成你的 AI 模型 和想要使用它…...

智能在线客服平台:数字化时代企业连接用户的 AI 中枢
随着互联网技术的飞速发展,消费者期望能够随时随地与企业进行交流。在线客服平台作为连接企业与客户的重要桥梁,不仅优化了客户体验,还提升了企业的服务效率和市场竞争力。本文将探讨在线客服平台的重要性、技术进展、实际应用,并…...
Frozen-Flask :将 Flask 应用“冻结”为静态文件
Frozen-Flask 是一个用于将 Flask 应用“冻结”为静态文件的 Python 扩展。它的核心用途是:将一个 Flask Web 应用生成成纯静态 HTML 文件,从而可以部署到静态网站托管服务上,如 GitHub Pages、Netlify 或任何支持静态文件的网站服务器。 &am…...
【HTTP三个基础问题】
面试官您好!HTTP是超文本传输协议,是互联网上客户端和服务器之间传输超文本数据(比如文字、图片、音频、视频等)的核心协议,当前互联网应用最广泛的版本是HTTP1.1,它基于经典的C/S模型,也就是客…...
高防服务器能够抵御哪些网络攻击呢?
高防服务器作为一种有着高度防御能力的服务器,可以帮助网站应对分布式拒绝服务攻击,有效识别和清理一些恶意的网络流量,为用户提供安全且稳定的网络环境,那么,高防服务器一般都可以抵御哪些网络攻击呢?下面…...

什么是Ansible Jinja2
理解 Ansible Jinja2 模板 Ansible 是一款功能强大的开源自动化工具,可让您无缝地管理和配置系统。Ansible 的一大亮点是它使用 Jinja2 模板,允许您根据变量数据动态生成文件、配置设置和脚本。本文将向您介绍 Ansible 中的 Jinja2 模板,并通…...