当前位置: 首页 > news >正文

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中&#xff0c;ArrayList 是一个动态数组实现&#xff0c;能够根据需要自动调整其大小。与传统的数组不同&#xff0c;ArrayList 不需要预先指定大小&#xff0c;并且提供了许多方便的方法来操作集合中的元素。下面将详细介绍如何使用 ArrayList 进行数组的扩展&#xff…...

Java:链接redis报错:NoSuchElementException: Unable to validate object

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

datasets库之load_dataset

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

React Router常见面试题目

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

sequelize-cli 封装登录接口

node ORM &#xff08;sequelize&#xff09;使用、查询、验证及express 基础框架的搭建及实例的使用 一、思路 第一步&#xff1a;肯定是用户要向接口传递邮箱、账号和密码了。 第二步&#xff1a;接口这边&#xff0c;先要验证。因为这里不是往数据库里存储数据&#xff0c;…...

使用 Elasticsearch 查询和数据同步的实现方法

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

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低通滤波器利用流过电感的电流不能突变也可以滤除高频噪声 那么问题来了两个低通滤波器&#xff0c;该怎么选择呢还是随便选一个就好&#xff1f; RC电路&#xff1a;因为电流电阻会发热耗能&#xff0c;所…...

芯旺微KF32A156芯片ADC配置

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

【Token】校验、会话技术、登录请求、拦截器【期末实训】实战项目学生和班级管理系统\Day15-后端Web实战(登录认证)\讲义

登录认证 在前面的课程中&#xff0c;我们已经实现了部门管理、员工管理的基本功能&#xff0c;但是大家会发现&#xff0c;我们并没有登录&#xff0c;就直接访问到了Tlias智能学习辅助系统的后台。 这是不安全的&#xff0c;所以我们今天的主题就是登录认证。 最终我们要实现…...

[Unity Shader] 【游戏开发】【图形渲染】Shader数学基础3:矢量与标量的乘法与除法详解

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

javalock(四)AQS派生类之Semphore逐行注释

简单概括&#xff1a; Semphore是一把共享锁&#xff08;即读锁&#xff09;&#xff0c;即实现了AQS的tryAcquireShared&&tryReleaseShared函数Semphore的逻辑是这样&#xff1a; 创建semphore的时候会初始化一个锁容量即permits&#xff0c;即最多同时允许permits个…...

【C语言】头文件”“和<>的详解

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

Elasticsearch:什么是信息检索?

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

Spark-Streaming容错语义

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

2024年12月陪玩系统-仿东郊到家约玩系统是一种新兴的线上预约线下社交、陪伴系统分享-优雅草央千澈-附带搭建教程

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

GUI07-学工具栏,懂MVC

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

【进程篇】04.进程的状态与优先级

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

ElasticSearch 数据聚合与运算

1、数据聚合 聚合&#xff08;aggregations&#xff09;可以让我们极其方便的实现数据的统计、分析和运算。实现这些统计功能的比数据库的 SQL 要方便的多&#xff0c;而且查询速度非常快&#xff0c;可以实现近实时搜索效果。 注意&#xff1a; 参加聚合的字段必须是 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 …...

React第五十七节 Router中RouterProvider使用详解及注意事项

前言 在 React Router v6.4 中&#xff0c;RouterProvider 是一个核心组件&#xff0c;用于提供基于数据路由&#xff08;data routers&#xff09;的新型路由方案。 它替代了传统的 <BrowserRouter>&#xff0c;支持更强大的数据加载和操作功能&#xff08;如 loader 和…...

以下是对华为 HarmonyOS NETX 5属性动画(ArkTS)文档的结构化整理,通过层级标题、表格和代码块提升可读性:

一、属性动画概述NETX 作用&#xff1a;实现组件通用属性的渐变过渡效果&#xff0c;提升用户体验。支持属性&#xff1a;width、height、backgroundColor、opacity、scale、rotate、translate等。注意事项&#xff1a; 布局类属性&#xff08;如宽高&#xff09;变化时&#…...

【HarmonyOS 5.0】DevEco Testing:鸿蒙应用质量保障的终极武器

——全方位测试解决方案与代码实战 一、工具定位与核心能力 DevEco Testing是HarmonyOS官方推出的​​一体化测试平台​​&#xff0c;覆盖应用全生命周期测试需求&#xff0c;主要提供五大核心能力&#xff1a; ​​测试类型​​​​检测目标​​​​关键指标​​功能体验基…...

【Redis技术进阶之路】「原理分析系列开篇」分析客户端和服务端网络诵信交互实现(服务端执行命令请求的过程 - 初始化服务器)

服务端执行命令请求的过程 【专栏简介】【技术大纲】【专栏目标】【目标人群】1. Redis爱好者与社区成员2. 后端开发和系统架构师3. 计算机专业的本科生及研究生 初始化服务器1. 初始化服务器状态结构初始化RedisServer变量 2. 加载相关系统配置和用户配置参数定制化配置参数案…...

Python爬虫(二):爬虫完整流程

爬虫完整流程详解&#xff08;7大核心步骤实战技巧&#xff09; 一、爬虫完整工作流程 以下是爬虫开发的完整流程&#xff0c;我将结合具体技术点和实战经验展开说明&#xff1a; 1. 目标分析与前期准备 网站技术分析&#xff1a; 使用浏览器开发者工具&#xff08;F12&…...

linux 下常用变更-8

1、删除普通用户 查询用户初始UID和GIDls -l /home/ ###家目录中查看UID cat /etc/group ###此文件查看GID删除用户1.编辑文件 /etc/passwd 找到对应的行&#xff0c;YW343:x:0:0::/home/YW343:/bin/bash 2.将标红的位置修改为用户对应初始UID和GID&#xff1a; YW3…...

Rust 异步编程

Rust 异步编程 引言 Rust 是一种系统编程语言,以其高性能、安全性以及零成本抽象而著称。在多核处理器成为主流的今天,异步编程成为了一种提高应用性能、优化资源利用的有效手段。本文将深入探讨 Rust 异步编程的核心概念、常用库以及最佳实践。 异步编程基础 什么是异步…...

数据库分批入库

今天在工作中&#xff0c;遇到一个问题&#xff0c;就是分批查询的时候&#xff0c;由于批次过大导致出现了一些问题&#xff0c;一下是问题描述和解决方案&#xff1a; 示例&#xff1a; // 假设已有数据列表 dataList 和 PreparedStatement pstmt int batchSize 1000; // …...

k8s业务程序联调工具-KtConnect

概述 原理 工具作用是建立了一个从本地到集群的单向VPN&#xff0c;根据VPN原理&#xff0c;打通两个内网必然需要借助一个公共中继节点&#xff0c;ktconnect工具巧妙的利用k8s原生的portforward能力&#xff0c;简化了建立连接的过程&#xff0c;apiserver间接起到了中继节…...

智能仓储的未来:自动化、AI与数据分析如何重塑物流中心

当仓库学会“思考”&#xff0c;物流的终极形态正在诞生 想象这样的场景&#xff1a; 凌晨3点&#xff0c;某物流中心灯火通明却空无一人。AGV机器人集群根据实时订单动态规划路径&#xff1b;AI视觉系统在0.1秒内扫描包裹信息&#xff1b;数字孪生平台正模拟次日峰值流量压力…...