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)对象。它有几个不同的用途,但最常见的是将一个可迭代对象(如元组、字符串、集合或其他列表)转换为一个新的列表。 以下是一些使用…...
公网环境下如何端口映射?
公网端口映射是一种网络技术,它允许将本地网络中的设备暴露在公共互联网上,以便能够从任何地方访问这些设备。通过公网端口映射,用户可以通过互联网直接访问和控制局域网中的设备,而无需在本地网络中进行复杂的配置。 公网端口映射…...
重复内容误标率高达37%?NotebookLM检测逻辑漏洞全曝光,立即修复这6个隐藏开关
更多请点击: https://intelliparadigm.com 第一章:重复内容误标率高达37%?NotebookLM检测逻辑漏洞全曝光,立即修复这6个隐藏开关 NotebookLM 的“重复内容检测”功能并非基于端到端语义比对,而是依赖于分块哈希&#…...
VisualCppRedist AIO:Windows系统运行库终极解决方案
VisualCppRedist AIO:Windows系统运行库终极解决方案 【免费下载链接】vcredist AIO Repack for latest Microsoft Visual C Redistributable Runtimes 项目地址: https://gitcode.com/gh_mirrors/vc/vcredist 你是否曾经在安装新软件或游戏时,突…...
用Java+GDAL+OpenCV玩转遥感图像:手把手教你实现Landsat标准假彩色合成(附完整代码)
JavaGDALOpenCV遥感图像处理实战:Landsat标准假彩色合成全流程解析 遥感图像处理正逐渐从专业软件向通用编程语言生态迁移。对于熟悉Java的开发者而言,利用GDAL和OpenCV这两个强大的库,完全可以构建自主可控的遥感处理流程。本文将完整展示如…...
写论文缺参考文献?教你一招最快的反向查文献
写文献综述、毕业论文、科研报告时,你是不是也常遇到这些难题:观点明明写得很清楚,却找不到权威文献支撑;文献综述凑不够篇幅,论据来源不充分;逐篇翻数据库筛选文献太耗时,引文格式排版还总出错…...
免费APK安装器:Windows上安装Android应用的终极解决方案
免费APK安装器:Windows上安装Android应用的终极解决方案 【免费下载链接】APK-Installer An Android Application Installer for Windows 项目地址: https://gitcode.com/GitHub_Trending/ap/APK-Installer 你是否曾想过在Windows电脑上直接运行Android应用&…...
Cursor Pro免费激活工具:技术探索与实践指南
Cursor Pro免费激活工具:技术探索与实践指南 【免费下载链接】cursor-free-vip [Support 0.45](Multi Language 多语言)自动注册 Cursor Ai ,自动重置机器ID , 免费升级使用Pro 功能: Youve reached your trial reques…...
告别卡顿!在Windows上用VirtualBox+Ubuntu 20.04搭建涂鸦Wi-Fi SoC开发环境(保姆级避坑指南)
告别卡顿!在Windows上用VirtualBoxUbuntu 20.04搭建涂鸦Wi-Fi SoC开发环境(保姆级避坑指南) 嵌入式开发环境搭建往往是工程师面临的第一个挑战。当你在Windows系统上尝试运行Linux虚拟机进行涂鸦Wi-Fi SoC开发时,可能会遇到各种性…...
5个技巧掌握Obsidian Dataview:从静态笔记到动态知识库的蜕变
5个技巧掌握Obsidian Dataview:从静态笔记到动态知识库的蜕变 【免费下载链接】obsidian-dataview A data index and query language over Markdown files, for https://obsidian.md/. 项目地址: https://gitcode.com/gh_mirrors/ob/obsidian-dataview Obsid…...
深度解析AzurLaneAutoScript:碧蓝航线自动化脚本的技术架构与应用实践
深度解析AzurLaneAutoScript:碧蓝航线自动化脚本的技术架构与应用实践 【免费下载链接】AzurLaneAutoScript Azur Lane bot (CN/EN/JP/TW) 碧蓝航线脚本 | 无缝委托科研,全自动大世界 项目地址: https://gitcode.com/gh_mirrors/az/AzurLaneAutoScript…...
IR 召回评测基准(英文数据集)——MS MARCO 实战指南
1. MS MARCO数据集全景解读 第一次接触MS MARCO时,我和大多数开发者一样困惑:这个号称"信息检索领域ImageNet"的数据集到底强在哪里?经过三个实际项目的验证,我发现它的价值在于完美复现了真实搜索场景的复杂性。想象你…...
