Java中通过ArrayList扩展数组
在Java中,ArrayList 是一个动态数组实现,能够根据需要自动调整其大小。与传统的数组不同,ArrayList 不需要预先指定大小,并且提供了许多方便的方法来操作集合中的元素。下面将详细介绍如何使用 ArrayList 进行数组的扩展,包括基本用法、常见操作以及一些最佳实践。
1. 基本概念
数组(Array):在Java中,数组的大小是固定的,一旦创建就无法更改其大小。如果需要存储更多元素,必须创建一个更大的新数组,并将原数组的元素复制到新数组中。
ArrayList:ArrayList 是 List 接口的一个实现类,底层使用数组来存储元素。它可以根据需要自动调整大小,提供了动态数组的功能。
2. 导入必要的包
在使用 ArrayList 之前,需要导入
import java.util.ArrayList;
3. 创建 ArrayList
3.1 使用泛型创建 ArrayList
使用泛型可以指定 ArrayList 中存储的对象类型,这有助于在编译时进行类型检查,避免运行时出现 ClassCastException。
// 创建一个存储 String 类型的 ArrayList
ArrayList<String> arrayList = new ArrayList<>();// 创建一个存储 Integer 类型的 ArrayList,初始容量为 10
ArrayList<Integer> numbers = new ArrayList<>(10);
3.2 不使用泛型创建 ArrayList
如果不使用泛型,ArrayList 将存储 Object 类型的元素,这可能导致类型安全问题。
ArrayList arrayList = new ArrayList();
arrayList.add("Hello");
arrayList.add(123); // 存储不同类型的元素
4. 数组扩展的实现
使用 ArrayList 进行数组扩展非常简单,因为 ArrayList 会自动处理数组大小的调整。以下是一些常见的操作:
4.1 添加元素
ArrayList<String> arrayList = new ArrayList<>();// 添加单个元素
arrayList.add("Apple");
arrayList.add("Banana");
arrayList.add("Cherry");// 在指定位置添加元素
arrayList.add(1, "Blueberry"); // 在索引 1 处添加 "Blueberry"
4.2 移除元素
// 移除指定元素
arrayList.remove("Banana");// 移除指定索引的元素
arrayList.remove(0); // 移除索引 0 处的元素
4.3 获取元素
String firstElement = arrayList.get(0); // 获取索引 0 处的元素
4.4 遍历 ArrayList
4.4.1 使用增强的 for 循环
for (String fruit : arrayList) {System.out.println(fruit);
}
4.4.2 使用迭代器
Iterator<String> iterator = arrayList.iterator();
while (iterator.hasNext()) {String fruit = iterator.next();System.out.println(fruit);
}
4.4.3 使用 forEach 和 Lambda 表达式
arrayList.forEach(fruit -> System.out.println(fruit))
4.5 查找元素
// 检查元素是否存在
boolean containsApple = arrayList.contains("Apple");// 获取元素的索引
int indexOfApple = arrayList.indexOf("Apple");
4.6 获取大小
int size = arrayList.size();
System.out.println("ArrayList 大小: " + size);
4.7 清空 ArrayList
arrayList.clear();
5. 内部实现原理
ArrayList 内部使用一个数组来存储元素。当添加元素导致数组容量不足时,ArrayList 会自动扩展其容量:
1. 初始容量:ArrayList 的默认初始容量为 10。
2. 扩容机制:当添加元素超过当前容量时,ArrayList 会创建一个新的数组,其大小为原数组的 1.5 倍(具体实现可能因Java版本而异),然后将原数组的元素复制到新数组中。
3. 性能考虑:频繁的扩容操作可能会影响性能,特别是在添加大量元素时。因此,如果预先知道需要存储的元素数量,可以在创建 ArrayList 时指定一个合适的初始容量。
// 指定初始容量为 100
ArrayList<String> arrayList = new ArrayList<>(100);
6. 示例代码
import java.util.ArrayList;
import java.util.Iterator;public class ArrayListExample {public static void main(String[] args) {// 创建一个 ArrayListArrayList<String> fruits = new ArrayList<>();// 添加元素fruits.add("Apple");fruits.add("Banana");fruits.add("Cherry");fruits.add("Date");System.out.println("初始 ArrayList: " + fruits);// 在指定位置添加元素fruits.add(2, "Blueberry");System.out.println("添加 Blueberry 后: " + fruits);// 移除元素fruits.remove("Banana");System.out.println("移除 Banana 后: " + fruits);// 移除指定索引的元素fruits.remove(0);System.out.println("移除索引 0 处的元素后: " + fruits);// 获取元素String firstFruit = fruits.get(0);System.out.println("第一个水果: " + firstFruit);// 查找元素boolean hasApple = fruits.contains("Apple");System.out.println("包含 Apple: " + hasApple);// 获取大小int size = fruits.size();System.out.println("ArrayList 大小: " + size);// 遍历 ArrayListSystem.out.println("遍历 ArrayList:");for (String fruit : fruits) {System.out.println(fruit);}// 使用迭代器遍历System.out.println("使用迭代器遍历:");Iterator<String> iterator = fruits.iterator();while (iterator.hasNext()) {String fruit = iterator.next();System.out.println(fruit);}// 清空 ArrayListfruits.clear();System.out.println("清空后的 ArrayList: " + fruits);}
}
输出:
初始 ArrayList: [Apple, Banana, Cherry, Date]
添加 Blueberry 后: [Apple, Banana, Blueberry, Cherry, Date]
移除 Banana 后: [Apple, Blueberry, Cherry, Date]
移除索引 0 处的元素后: [Blueberry, Cherry, Date]
第一个水果: Blueberry
包含 Apple: false
ArrayList 大小: 3
遍历 ArrayList:
Blueberry
Cherry
Date
使用迭代器遍历:
Blueberry
Cherry
Date
清空后的 ArrayList: []
7. 常见问题
7.1 ArrayList 与 LinkedList 的区别
内部实现:ArrayList 使用数组实现,而 LinkedList 使用双向链表实现。
访问速度:ArrayList 在随机访问元素时性能更好,而 LinkedList 在频繁插入和删除元素时性能更优。
内存开销:ArrayList 的内存开销较低,而 LinkedList 需要额外的指针存储前驱和后继节点。
7.2 ArrayList 与普通数组的区别
大小可变:ArrayList 可以动态调整大小,而普通数组大小固定。
方法丰富:ArrayList 提供了许多方便的方法,如 add, remove, contains, indexOf 等。
泛型支持:ArrayList 支持泛型,提供编译时类型检查。
8. 总结
ArrayList 是Java中非常常用的集合类,提供了动态数组的功能。通过使用 ArrayList,可以简化数组操作,提高代码的可维护性和灵活性。在选择使用 ArrayList 还是普通数组时,应根据具体需求权衡:
如果需要频繁添加或删除元素,推荐使用 ArrayList。
如果对性能有严格要求,且元素数量固定,可以使用普通数组。
相关文章:

Java中通过ArrayList扩展数组
在Java中,ArrayList 是一个动态数组实现,能够根据需要自动调整其大小。与传统的数组不同,ArrayList 不需要预先指定大小,并且提供了许多方便的方法来操作集合中的元素。下面将详细介绍如何使用 ArrayList 进行数组的扩展ÿ…...

Java:链接redis报错:NoSuchElementException: Unable to validate object
目录 前言报错信息排查1、确认redis密码设置是否有效2、确认程序配置文件,是否配置了正确的redis登录密码3、检测是否是redis持久化的问题4、确认程序读取到的redis密码没有乱码 原因解决 前言 一个已经上线的项目,生产环境的redis居然没有设置密码&…...

datasets库之load_dataset
目录 问题解决方案 问题 使用peft用lora微调blip2时用到了一个足球数据集,如下: 原始代码如下 dataset load_dataset("ybelkada/football-dataset", split"train")然而这需要梯子才能下载,服务器较难用VPN所以使用au…...

React Router常见面试题目
1. React Router 支持哪几种模式? React Router 支持以下两种主要模式: BrowserRouter (基于 HTML5 History API 的模式) 原理: 利用 history.pushState 和 history.replaceState 操作浏览器历史栈,无需重新加载页面。URL 看起来像传统 URL…...

sequelize-cli 封装登录接口
node ORM (sequelize)使用、查询、验证及express 基础框架的搭建及实例的使用 一、思路 第一步:肯定是用户要向接口传递邮箱、账号和密码了。 第二步:接口这边,先要验证。因为这里不是往数据库里存储数据,…...

使用 Elasticsearch 查询和数据同步的实现方法
在开发过程中,将数据从数据库同步到 Elasticsearch (ES) 是常见的需求之一。本文将重点介绍如何通过 Python 脚本将数据库中的数据插入或更新到 Elasticsearch,并基于多字段的唯一性来判断是否执行插入或更新操作。此外,我们还将深入探讨如何…...

QTday1作业设置简易登录界面
代码 #include "mywidget.h"MyWidget::MyWidget(QWidget *parent): QWidget(parent) {//创建一个标签QLabel *lab1 new QLabel(this);//重新设置大小lab1->resize(1925,1080);//用动图类QMovie实例化一个动图QMovie *mv new QMovie("C:\\Users\\MR\\Deskto…...

RC低通滤波器和LR低通滤波器,LC低通滤波器该怎么选择
这是RC低通滤波器利用电容两端的电压不能突变可以滤除高频噪声 这是LR低通滤波器利用流过电感的电流不能突变也可以滤除高频噪声 那么问题来了两个低通滤波器,该怎么选择呢还是随便选一个就好? RC电路:因为电流电阻会发热耗能,所…...

芯旺微KF32A156芯片ADC配置
使用芯旺微KF32A156的芯片做预研项目,使用了ADC0外设,根据芯片规格书中的描述进行了配置: /*** brief: Configure ADC.** param[in] none.* param[in] none.* param[out] None* retval: None*/ static void adc_peripheral_init(void) …...

【Token】校验、会话技术、登录请求、拦截器【期末实训】实战项目学生和班级管理系统\Day15-后端Web实战(登录认证)\讲义
登录认证 在前面的课程中,我们已经实现了部门管理、员工管理的基本功能,但是大家会发现,我们并没有登录,就直接访问到了Tlias智能学习辅助系统的后台。 这是不安全的,所以我们今天的主题就是登录认证。 最终我们要实现…...

[Unity Shader] 【游戏开发】【图形渲染】Shader数学基础3:矢量与标量的乘法与除法详解
在计算机图形学和Shader编程中,矢量(Vector)运算是非常基础的数学知识。其中,矢量与标量(Scalar)的乘法与除法是常见的操作。本篇文章将通过详细分析,以及实例讲解矢量和标量的乘除法运算,帮助大家更好地理解并应用到实际开发中。 什么是矢量与标量? 在开始具体运算之…...

javalock(四)AQS派生类之Semphore逐行注释
简单概括: Semphore是一把共享锁(即读锁),即实现了AQS的tryAcquireShared&&tryReleaseShared函数Semphore的逻辑是这样: 创建semphore的时候会初始化一个锁容量即permits,即最多同时允许permits个…...

【C语言】头文件”“和<>的详解
前言 作者在刚开始学C语言的时候,都是用的< >去引用头文件,但在学习STM32的时候发现,程序中大量使用" "去引用双引号。 那么二者有什么区别呢? 无论使用哪种方式,头文件的目的都是为了引用你需要的文件供你编程使…...

Elasticsearch:什么是信息检索?
信息检索定义 信息检索 (IR) 是一种有助于从大量非结构化或半结构化数据中有效、高效地检索相关信息的过程。信息(IR)检索系统有助于搜索、定位和呈现与用户的搜索查询或信息需求相匹配的信息。 作为信息访问的主要形式,信息检索是每天使用…...

Spark-Streaming容错语义
一、背景 为了理解Spark Streaming提供的语义,我们先回顾西Spark RDD的基本容错语义学。 RDD是一个不可变的、确定性可重新计算的分布式数据集。每个RDD都记住在容错输入数据集上用于创建它的确定性操作的沿袭。如果RDD的任何分区由于工作节点故障而丢失ÿ…...

2024年12月陪玩系统-仿东郊到家约玩系统是一种新兴的线上预约线下社交、陪伴系统分享-优雅草央千澈-附带搭建教程
2024年12月陪玩系统-仿东郊到家约玩系统是一种新兴的线上预约线下社交、陪伴系统分享-优雅草央千澈-附带搭建教程 产品介绍 仿东郊到家约玩系统是一种新兴的线上预约,线下社交、陪伴、助娱、助攻、分享、解答、指导等服务模式,范围涉及电竞、运动、音乐…...

GUI07-学工具栏,懂MVC
MVC模式,是天底下编写GUI程序最为经典、实效的一种软件架构模式。当一个人学完菜单栏、开始学习工具栏时,就是他的一生中,最适合开始认识 MVC 模式的好时机之一。这节将安排您学习: Model-View-Controller 模式如何创建工具栏以及…...

【进程篇】04.进程的状态与优先级
一、进程的状态 1.1 进程的状态 1.1.1 并行与并发 • 并行: 多个进程在多个CPU下分别,同时进行运行 • 并发: 多个进程在一个CPU下采用进程切换的方式,在一个时间片内,让多个进程都得以推进 1.1.2 时间片的概念 LInux/windows这些民用级别…...

ElasticSearch 数据聚合与运算
1、数据聚合 聚合(aggregations)可以让我们极其方便的实现数据的统计、分析和运算。实现这些统计功能的比数据库的 SQL 要方便的多,而且查询速度非常快,可以实现近实时搜索效果。 注意: 参加聚合的字段必须是 keywor…...

科研学习|论文解读——智能体最新研究进展
从2024-12-13到2024-12-18的45篇文章中精选出5篇优秀的工作分享 Can Modern LLMs Act as Agent Cores in Radiology~Environments? Achieving Collective Welfare in Multi-Agent Reinforcement Learning via Suggestion Sharing A systematic review of norm emergence in …...

面试小札:Java后端闪电五连鞭_8
1. Kafka消息模型及其组成部分 - 消息(Message):是Kafka中最基本的数据单元。消息包含一个键(key)、一个值(value)和一个时间戳(timestamp)。键可以用于对消息进行分区等…...

java error(2)保存时间带时分秒,回显时分秒变成00:00:00
超简单,顺带记录一下 1.入参实体类上使用注释:JsonFormat(pattern “yyyy-MM-dd”) 导致舍弃了 时分秒的部分。 2.数据库字段对应的类型是 date。date就是日期,日期就不带时分秒。 3.返参实体类使用了JsonFormat(pattern “yyyy-MM-dd”) 导…...

计算机毕业设计python+spark+hive动漫推荐系统 漫画推荐系统 漫画分析可视化大屏 漫画爬虫 漫画推荐系统 漫画爬虫 知识图谱 大数据毕设
温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 作者简介:Java领…...

数字IC后端设计实现篇之TSMC 12nm TCD cell(Dummy TCD Cell)应该怎么加?
TSMC 12nm A72项目我们需要按照foundary的要求提前在floorplan阶段加好TCD Cell。这个cell是用来做工艺校准的。这个dummy TCD Cell也可以等后续Calibre 插dummy自动插。但咱们项目要求提前在floorplan阶段就先预先规划好位置。 TSCM12nm 1P9M的metal stack结构图如下图所示。…...

(8)YOLOv6算法基本原理
一、YOLOv6 模型原理 发布日期:2022年6月 作者:美团技术团队 骨干网络:参考了 RepVGG 的设计,将重参数化能力进行补强,增强了模型结构的重参数化能力。使用了深度可分离卷积和跨阶段连接等技术,旨在提升…...

LNMP+discuz论坛
0.准备 文章目录 0.准备1.nginx2.mysql2.1 mysql82.2 mysql5.7 3.php4.测试php访问mysql5.部署 Discuz6.其他 yum源: # 没有wget,用这个 # curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo[rootlocalhost ~]#…...

在linux系统的docker中安装GitLab
一、安装GitLab: 在安装了docker之后就是下载安装GitLab了,在linux系统中输入命令:docker search gitlab就可以看到很多项目,一般安装第一个,它是英文版的,如果英文不好可以安装twang2218/gitlab-ce-zh。 …...

Python面试常见问题及答案12
问题: 请解释Python中的GIL(全局解释器锁)是什么? ○ 答案: GIL是Python解释器中的一种机制,用于确保任何时候只有一个线程在执行Python字节码。这在多线程场景下可能影响性能优化,但对于单线程…...

从0-1开发一个Vue3前端系统页面-9.博客页面布局
本节主要实现了博客首页界面的基本布局并完善了响应式布局,因为完善了响应式布局故对前面的页面布局有所改动,这里会将改动后的源码同步上传。 1.对页面头部的用户信息进行设计和美化 布局设计参考 :通常初级前端的布局会通过多个div划分区域…...

[手机Linux] 六,ubuntu18.04私有网盘(NextCloud)安装
一,LNMP介绍 LNMP一键安装包是一个用Linux Shell编写的可以为CentOS/RHEL/Fedora/Debian/Ubuntu/Raspbian/Deepin/Alibaba/Amazon/Mint/Oracle/Rocky/Alma/Kali/UOS/银河麒麟/openEuler/Anolis OS Linux VPS或独立主机安装LNMP(Nginx/MySQL/PHP)、LNMPA(Nginx/MySQ…...