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 …...
利用最小二乘法找圆心和半径
#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …...
国防科技大学计算机基础课程笔记02信息编码
1.机内码和国标码 国标码就是我们非常熟悉的这个GB2312,但是因为都是16进制,因此这个了16进制的数据既可以翻译成为这个机器码,也可以翻译成为这个国标码,所以这个时候很容易会出现这个歧义的情况; 因此,我们的这个国…...
基于距离变化能量开销动态调整的WSN低功耗拓扑控制开销算法matlab仿真
目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.算法仿真参数 5.算法理论概述 6.参考文献 7.完整程序 1.程序功能描述 通过动态调整节点通信的能量开销,平衡网络负载,延长WSN生命周期。具体通过建立基于距离的能量消耗模型&am…...
Cesium1.95中高性能加载1500个点
一、基本方式: 图标使用.png比.svg性能要好 <template><div id"cesiumContainer"></div><div class"toolbar"><button id"resetButton">重新生成点</button><span id"countDisplay&qu…...
工程地质软件市场:发展现状、趋势与策略建议
一、引言 在工程建设领域,准确把握地质条件是确保项目顺利推进和安全运营的关键。工程地质软件作为处理、分析、模拟和展示工程地质数据的重要工具,正发挥着日益重要的作用。它凭借强大的数据处理能力、三维建模功能、空间分析工具和可视化展示手段&…...
Angular微前端架构:Module Federation + ngx-build-plus (Webpack)
以下是一个完整的 Angular 微前端示例,其中使用的是 Module Federation 和 npx-build-plus 实现了主应用(Shell)与子应用(Remote)的集成。 🛠️ 项目结构 angular-mf/ ├── shell-app/ # 主应用&…...
C++使用 new 来创建动态数组
问题: 不能使用变量定义数组大小 原因: 这是因为数组在内存中是连续存储的,编译器需要在编译阶段就确定数组的大小,以便正确地分配内存空间。如果允许使用变量来定义数组的大小,那么编译器就无法在编译时确定数组的大…...
基于SpringBoot在线拍卖系统的设计和实现
摘 要 随着社会的发展,社会的各行各业都在利用信息化时代的优势。计算机的优势和普及使得各种信息系统的开发成为必需。 在线拍卖系统,主要的模块包括管理员;首页、个人中心、用户管理、商品类型管理、拍卖商品管理、历史竞拍管理、竞拍订单…...
虚拟电厂发展三大趋势:市场化、技术主导、车网互联
市场化:从政策驱动到多元盈利 政策全面赋能 2025年4月,国家发改委、能源局发布《关于加快推进虚拟电厂发展的指导意见》,首次明确虚拟电厂为“独立市场主体”,提出硬性目标:2027年全国调节能力≥2000万千瓦࿰…...
4. TypeScript 类型推断与类型组合
一、类型推断 (一) 什么是类型推断 TypeScript 的类型推断会根据变量、函数返回值、对象和数组的赋值和使用方式,自动确定它们的类型。 这一特性减少了显式类型注解的需要,在保持类型安全的同时简化了代码。通过分析上下文和初始值,TypeSc…...
