Java数组:Arrays 和 ArrayList 的基本操作

news2024/10/10 17:31:50

文章目录

  • Arrays数组
    • 什么是数组?
    • 声明和初始化数组
      • 声明数组
      • 初始化数组
        • 直接初始化
        • 使用循环初始化
    • 访问数组元素
    • 数组的长度
    • 遍历数组
      • 使用 `for` 循环遍历数组
      • 使用 `foreach` 循环遍历数组
    • 数组的常见操作
      • 添加元素
      • 删除元素
      • 查找元素
    • 多维数组
      • 二维数组
      • 不规则二维数组
    • 数组的性能和内存管理
      • 内存分配
      • 性能考虑
    • 注意事项
  • ArrayList 可变数组
    • 什么是 ArrayList?
    • ArrayList 的声明与初始化
      • 声明 ArrayList
      • 初始化 ArrayList
    • ArrayList 的常见操作
      • 添加元素
      • 访问元素
      • 修改元素
      • 删除元素
      • 查找元素
    • 遍历 ArrayList
      • 使用 `for` 循环遍历
      • 使用 `foreach` 循环遍历
      • 使用迭代器遍历
    • ArrayList 的大小和容量
      • 获取大小
      • 动态扩展
    • 注意事项

Arrays数组

什么是数组?

▪ 一种简单的数据结构
▪ 元素具有相同的数据类型
▪ 一旦创建之后,尺寸保持不变
▪ 元素在内存中连续分布

声明和初始化数组

在 Java 中,要使用数组,首先需要声明和初始化它。

声明数组

声明数组时,你需要指定数组的类型,后面跟着数组名字和一对方括号 [],例如:

int[] numbers; // 声明一个整数数组
//声明也可以写成c/c++风格的  int numbers[];

你也可以在声明时为数组分配内存:

int[] numbers = new int[5]; // 声明并分配一个包含 5 个整数的数组

初始化数组

初始化数组是为数组分配内存并赋予初值。Java 中有几种初始化数组的方式。

直接初始化

你可以在声明数组的同时为数组分配内存并赋值:

int[] numbers = {1, 2, 3, 4, 5}; // 直接初始化一个整数数组
使用循环初始化

使用循环来初始化数组的示例:

int[] numbers = new int[5]; // 声明一个包含 5 个整数的数组
for (int i = 0; i < 5; i++) {
    numbers[i] = i + 1; // 初始化数组元素
}

访问数组元素

访问数组元素是通过数组的索引来获取数组中的值。在 Java 中,数组的索引从 0 开始,例如:

int firstNumber = numbers[0]; // 获取第一个元素的值,即 1

数组的长度

要获取数组的长度(即数组中元素的个数),可以使用数组的 length 属性:

int length = numbers.length; // 获取数组 numbers 的长度

这在处理动态数据时非常有用,例如当需要遍历数组时,使用 length 属性可以避免手动维护数组的大小。

遍历数组

遍历数组是逐个访问数组中的所有元素,通常使用循环来实现。在 Java 中,常用的循环有 for 循环和 foreach 循环。

使用 for 循环遍历数组

int[] numbers = {1, 2, 3, 4, 5};
for (int i = 0; i < numbers.length; i++) {
    System.out.println(numbers[i]); // 输出数组元素
}

这种方式提供了访问数组索引的灵活性,可以根据需要进行条件控制。

使用 foreach 循环遍历数组

foreach 循环在 Java 5 引入,可以更简洁地遍历数组:(只读的形式遍历,不能操作原数据)

for (int number : numbers) {
    System.out.println(number); // 输出数组元素
}

使用 foreach 循环可以减少出错的可能性,尤其是在需要遍历大数组时。

数组的常见操作

除了声明、初始化和遍历数组,数组还支持许多常见的操作,如添加元素、删除元素和查找元素。

添加元素

要向数组添加元素,需要创建一个新的数组,将原数组的元素复制到新数组中,并在新数组中添加新元素。示例:

int[] numbers = {1, 2, 3, 4, 5};
int[] newArray = new int[numbers.length + 1]; // 创建一个新数组
for (int i = 0; i < numbers.length; i++) {
    newArray[i] = numbers[i]; // 复制元素
}
newArray[newArray.length - 1] = 6; // 添加新元素
numbers = newArray; // 更新原数组

删除元素

删除数组中的元素通常也需要创建一个新数组,将原数组中不需要删除的元素复制到新数组中:

int[] numbers = {1, 2, 3, 4, 5};
int elementToRemove = 3; // 要删除的元素
int[] newArray = new int[numbers.length - 1];
int newIndex = 0;

for (int i = 0; i < numbers.length; i++) {
    if (numbers[i] != elementToRemove) {
        newArray[newIndex] = numbers[i];
        newIndex++;
    }
}
numbers = newArray; // 更新数组

这种方式虽然可以实现功能,但效率较低,尤其是在频繁进行添加或删除操作时。

查找元素

在数组中查找元素,可以使用循环遍历数组,逐个比较每个元素的值:

int[] numbers = {1, 2, 3, 4, 5};
int elementToFind = 3; // 要查找的元素
int foundIndex = -1; // 初始化为 -1 表示未找到

for (int i = 0; i < numbers.length; i++) {
    if (numbers[i] == elementToFind) {
        foundIndex = i;
        break; // 找到元素后退出循环
    }
}

if (foundIndex != -1) {
    System.out.println("找到元素 " + elementToFind + ",索引为 " + foundIndex);
} else {
    System.out.println("未找到元素 " + elementToFind);
}

对于较大的数组,查找效率可以通过对数组进行排序后使用二分查找算法来提升。

多维数组

除了常见的一维数组,Java 还支持多维数组,即数组的数组。多维数组可以看作是矩阵或表格。

二维数组

二维数组是最常见的多维数组,通常用于表示矩阵。声明和初始化二维数组的示例:

int[][] matrix = new int[3][4]; // 声明一个 3x4 的二维整数数组
matrix[0][0] = 1; // 设置第一行第一列的值为 1
int value = matrix[1][2]; // 获取第二行第三列的值

使用二维数组可以方便地表示表格数据,比如学生的成绩表。

不规则二维数组

Java 的二维数组可以是不规则的:

int[][] arr = new int[3][]; // 不规则数组
arr[0] = new int[]{1, 2, 3, 4};
arr[1] = new int[]{1, 2};
arr[2] = new int[]{3, 4};

for (int i = 0; i < arr.length; i++) {
    for (int j = 0; j < arr[i].length; j++) {
        System.out.print(arr[i][j] + " ");
    }
    System.out.println();
}

这种灵活性使得多维数组在处理不同规模数据时非常有效。

数组的性能和内存管理

数组在性能上有显著优势,尤其是在内存连续分配的情况下。数组的大小在创建时固定,Java 虚拟机(JVM)在堆内存中分配数组的内存空间。由于数组是对象,因此它们的引用存储在栈内存中,而实际的数据存储在堆内存中。

内存分配

当声明数组时,JVM 会为其分配足够的内存。例如,创建一个整型数组 new int[5] 时,JVM 会在堆内存中分配 5 个整数的空间。值得注意的是,数组元素的默认值根据类型不同而有所区别:整数默认为 0,布尔值默认为 false,引用类型默认为 null。

性能考虑

虽然数组访问速度快,但它们的大小是固定的。在需要频繁调整大小的场景下,使用 ArrayList 或其他集合类更为合适。Java 的 ArrayList 底层使用数组实现,但提供了动态大小调整的功能。

注意事项

  • 数组的大小是固定的,一旦创建,不能更改。
  • 数组的索引从 0 开始,访问越界的索引会导致 ArrayIndexOutOfBoundsException
  • 多维数组的访问需要提供相应数量的索引。
  • 对于大规模数据,考虑使用动态数据结构,如链表或集合类。

ArrayList 可变数组

什么是 ArrayList?

在 Java 中,ArrayList 是一个可变长度的数组实现,属于 java.util 包。与普通数组不同,ArrayList 允许动态调整其大小,因此它可以根据需要存储任意数量的元素。ArrayList 主要用于存储对象,可以包含重复元素,并且它们的顺序与插入顺序一致。

ArrayList 是实现 List 接口的一个类,提供了比数组更灵活的数据存储方式,特别适合需要频繁增删元素的场景。

ArrayList 的声明与初始化

要使用 ArrayList,需要导入 java.util.ArrayList 类。ArrayList 的声明和初始化非常简单。

声明 ArrayList

import java.util.ArrayList;

ArrayList<String> list; // 声明一个字符串类型的 ArrayList

初始化 ArrayList

可以在声明时直接初始化:

ArrayList<String> list = new ArrayList<>(); // 初始化一个空的 ArrayList

你也可以使用指定初始容量的构造函数:

ArrayList<Integer> numbers = new ArrayList<>(10); // 初始化一个容量为 10 的 ArrayList

ArrayList 的常见操作

添加元素

使用 add() 方法向 ArrayList 中添加元素:

list.add("Hello"); // 添加字符串 "Hello"
list.add("World"); // 添加字符串 "World"

添加元素时,可以在指定索引位置插入元素:

list.add(1, "Java"); // 在索引 1 处插入 "Java"

访问元素

可以使用 get() 方法通过索引访问元素:

String firstElement = list.get(0); // 获取第一个元素

修改元素

使用 set() 方法可以修改指定索引位置的元素:

list.set(1, "Programming"); // 将索引 1 的元素修改为 "Programming"

删除元素

删除元素可以使用 remove() 方法,通过元素值或索引进行删除:

list.remove("Hello"); // 删除元素 "Hello"
list.remove(0); // 删除索引 0 处的元素

查找元素

使用 contains() 方法检查 ArrayList 中是否包含特定元素:

boolean hasWorld = list.contains("World"); // 检查是否包含 "World"

使用 indexOf() 方法可以找到元素的索引:

int index = list.indexOf("Programming"); // 查找 "Programming" 的索引

遍历 ArrayList

遍历 ArrayList 的方式有多种,最常用的包括 for 循环、foreach 循环和迭代器。

使用 for 循环遍历

for (int i = 0; i < list.size(); i++) {
    System.out.println(list.get(i)); // 输出每个元素
}

使用 foreach 循环遍历

foreach 循环可以更简洁地遍历元素:

for (String item : list) {
    System.out.println(item); // 输出每个元素
}

使用迭代器遍历

import java.util.Iterator;

Iterator<String> iterator = list.iterator();
while (iterator.hasNext()) {
    System.out.println(iterator.next()); // 输出每个元素
}

ArrayList 的大小和容量

获取大小

使用 size() 方法获取 ArrayList 中元素的数量:

int size = list.size(); // 获取当前 ArrayList 的大小

动态扩展

ArrayList 可以动态扩展其容量。当添加新元素时,如果当前容量不足,ArrayList 会自动增加容量,通常是原来容量的 1.5 倍。这种特性使得 ArrayList 非常灵活。

注意事项

  • ArrayList 不能存储基本数据类型,但可以存储其包装类,如 IntegerDouble 等。
  • 在多线程环境下,使用 ArrayList 时要注意线程安全问题,通常建议使用 Collections.synchronizedList() 方法将其转化为线程安全的列表。
  • 如果需要频繁插入和删除操作,考虑使用 LinkedList,因为其在链表中插入和删除元素的效率更高。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2202610.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

kafka快速入门系统学习示例

1.主要名词 Broker&#xff1a;消息中间件处理节点&#xff0c;⼀个Kafka节点就是⼀个broker&#xff0c;⼀个或者多个 Broker可以组成⼀个Kafka集群。 partition&#xff1a;通过partition将⼀个topic中的消息分区来存储。这样的好处有多个&#xff1a;分区存储&#xff0…

ArgoWorkflow教程(六)---无缝实现步骤间参数传递

之前我们分析了&#xff0c;Workflow、WorkflowTemplate 、template 3 者之间如何传递参数。 本文主要分析同一个 Workflow 中的不同 step 之间实现参数传递&#xff0c;比如将上一个步骤的输出作为下一个步骤的结果进行使用&#xff08;而非以文件方式传递&#xff09;。 1. …

引领零售未来:年销售额500亿的运动品牌如何实现多渠道会员管理?

通过技术创新和全渠道整合&#xff0c;提升运动品牌影响力、用户粘性和市场竞争力。 运动热情高涨持续释放消费潜力&#xff0c;全球知名运动品牌2024财年营收超500亿美元&#xff0c;保持七个季度连续增长。 而随着电商的崛起和消费习惯的变化&#xff0c;会员数量激增且分布…

Android实现ViewPager剧中放大效果

效果图 实现方式核心思想是自定义PageTransformer继承ViewPager.PageTransformer&#xff0c;精确控制每一个page的动效。 PageTransformer的transformPage方法并不会区分当前的page是哪一个&#xff0c;所以需要我们自己去识别&#xff0c;我的方法是每个page添加一个text显…

Nuxt.js 应用中的 page:transition:finish 钩子详解

title: Nuxt.js 应用中的 page:transition:finish 钩子详解 date: 2024/10/10 updated: 2024/10/10 author: cmdragon excerpt: page:transition:finish 是 Nuxt.js 中的一个事件钩子,专门用于处理页面过渡效果结束后的逻辑。这一钩子在页面过渡的 onAfterLeave 事件之后…

qt+opengl 实现纹理贴图,平移旋转,绘制三角形,方形

1 首先qt 已经封装了opengl&#xff0c;那么我们就可以直接用了&#xff0c;这里面有三个函数需要继承 virtual void initializeGL() override; virtual void resizeGL(int w,int h) override; virtual void paintGL() override; 这三个函数是实现opengl的重要函数。 2 我们…

【NLP自然语言处理】03 - 使用Anaconda创建新的环境/pycharm切换环境

NLP基础阶段&#xff1a;创建新的虚拟环境 第一步&#xff1a;查看有多少个虚拟环境 conda env list 第二步&#xff1a;创建一个新的虚拟环境&#xff0c;起个名字&#xff1a;nlpbase 打开anconda prompt终端&#xff0c;输入命令: conda create -n nlpbase python3.10 第三步…

基于xml配置文件的Spring事务

在项目中对事务属性通常传播属性&#xff0c;回滚属性&#xff0c;隔离级别&#xff0c;超时属性都取默认值&#xff0c;只有只读属性会如下的配置&#xff1a; 什么意思&#xff1a;Service层你的类里的方法&#xff0c;以get&#xff0c;find&#xff0c;select等开头的方法是…

如何进行数据中心负载测试的自动化?

数据中心负载测试的自动化是一种通过使用软件工具和脚本来模拟大量用户访问数据中心的过程&#xff0c;以评估其性能、稳定性和可扩展性的方法。以下是进行数据中心负载测试自动化的一些建议&#xff1a; 市场上有许多负载测试工具可供选择&#xff0c;如LoadRunner、JMeter、…

【图论】(二)图论基础与路径问题

图论基础与路径问题 图的构造邻接矩阵邻接表 所有可达路径邻接矩阵存储邻接表存储 字符串接龙有向图的完全可达性 图的构造 这里仅对图论路径问题中图的构造做整理总结归纳&#xff0c;具体详细相关概念请参考代码随想录上的整理总结&#xff1a; 图论理论基础深度优先搜索理…

C语言函数栈帧的创建与销毁(32)

文章目录 前言一、什么是函数栈帧&#xff1f;二、理解函数栈帧能解决什么问题&#xff1f;三、函数栈帧的创建和销毁解析什么是栈&#xff1f;认识相关寄存器和汇编指令 四、解析函数栈帧的创建和销毁预备知识函数的调用堆栈准备环境转到反汇编函数栈帧的创建函数栈帧的销毁 五…

采用反相正基准电压电路的反相运算放大器

1 简介 本设计使用采用反相正基准电压的反相放大器将 –5V 至 –1V 的输入信号转换为 3.3V 至 0.05V 的输出电压。该电路可用于将传感器负输出电压转换为可用的 ADC 输入电压范围。 2 设计目标 2.1 输入 2.2 输出 2.3 电源 3 电路设计 根据设计目标&#xff0c;最终设计的电…

2.1类和对象(上)

本篇博客来梳理类和对象的基础知识 一、类的定义 1&#xff0e;类定义格式 &#xff08;1&#xff09;关键字&#xff1a;class。类中的变量称为类的属性/成员变量&#xff0c;类中的函数称为类的方法/成员函数 &#xff08;2&#xff09;为区分成员变量&#xff0c;一般会加…

MES管理系统对中小企业有哪些帮助

MES管理系统解决方案对中小企业具有显著的帮助&#xff0c;主要体现在以下几个方面&#xff1a; 一、提升生产效率 MES管理系统能够实时监控生产过程&#xff0c;提供准确的生产数据和及时的反馈。这种实时监控与数据分析能力&#xff0c;使中小企业能够精准把握生产脉搏&…

如何应对动态图片大小变化?Python解决网页图片截图难题

背景介绍 随着互联网的发展&#xff0c;许多网站&#xff0c;尤其是电商平台&#xff0c;如京东&#xff08;JD.com&#xff09;&#xff0c;为了提升用户体验&#xff0c;采用了许多动态内容加载技术。当我们使用爬虫获取商品图片时&#xff0c;往往会遇到一些棘手问题&#…

中科星图GVE(案例)——AI提取指定采样区域的建筑物范围

目录 简介 函数 gve.Image.fromGeometry(geometry,source,options) gve.Services.AI.buildingExtraction(fromGridRes) 代码 结果 ​编辑 知识星球 机器学习 简介 要提取指定采样区域的建筑物范围&#xff0c;可以使用遥感图像处理和计算机视觉技术。以下是一种可能的…

软考攻略/超详细/系统集成项目管理工程师/基础知识分享14

5.4 软件实现 5.4.1 软件配置管理&#xff08;掌握&#xff09; 软件配置管理&#xff08;SCM&#xff09;是一种标识、组织和控制修改的技术。软件配置管理应用于整个软件工程过程。 SCM活动的目标就是标识变更、控制变更、确保变更正确 SCM的目的是使错误降为最小&#xff0…

申报审批|基于springBoot的入校申报审批系统设计与实现(附项目源码+论文+数据库)

私信或留言即免费送开题报告和任务书&#xff08;可指定任意题目&#xff09; 目录 一、摘要 二、相关技术 三、系统设计 四、数据库设计 五、核心代码 六、论文参考 七、源码获取 一、摘要 传统办法管理信息首先需要花费的时间比较多&#xff0c;其次数据出…

数据库中间件 -- MyCat

1、什么是数据库中间件 数据库中间件(Database Middleware)是一种位于应用程序与数据库管理系统(DBMS)之间的软件层。它的主要目的是为应用程序提供更加高效、可靠和透明的数据库访问,同时解决多种数据库管理问题。 The domain name Mycat.io is for sale 1.1、常见的数…

新质生产力在制造业中的“新”主要体现在哪

新质生产力&#xff0c;以其独特的技术创新、模式变革和思维升级&#xff0c;正逐步重塑制造业的面貌&#xff0c;引领其走向更加智能化、绿色化和高效化的未来。 一、技术创新&#xff1a;驱动产业升级的核心引擎 新质生产力在制造业中的首要“新”&#xff0c;体现在技术创新…