news 2026/7/27 6:45:09

JavaSE 基础语法 - 数组的定义与使用 - ②

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
JavaSE 基础语法 - 数组的定义与使用 - ②

接上节 JavaSE 基础语法 - 数组的定义与使用 - ① 的内容。

七、数组元素的访问

一个数组包含:

  • 数组变量;
  • 数组对象;
  • 数组元素;
  • 数组索引。

其中,数组元素通过索引进行访问。

7.1 通过索引访问数组元素

数组访问格式:

数组名[索引]

例如:

int[]nums={10,20,30,40};System.out.println(nums[0]);

输出:

10

这里nums[0]表示访问数组中索引为 0 的元素。

数组对应关系:

索引:0123↓ ↓ ↓ ↓10203040

因此:

nums[0]->20nums[2]->30

注意:

  • 数组索引从 0 开始。
  • 如果想要访问最后一个元素,可以使用 数组长度 - 1。

7.2 修改数组元素

数组元素不仅可以读取,也可以修改。

例如:

int[]nums={10,20,30};nums[1]=200;System.out.println(nums[1]);

输出:

200

执行过程:

修改前:

┌─────────────┐ │102030│ └─────────────┘

执行:

nums[1]=200;

修改后:

┌───────────────┐ │1020030│ └───────────────┘

注意:修改的是数组对象中的元素。

数组长度不会发生变化。

7.3 获取数组长度

Java 数组提供了:length属性。

用于获取数组中元素的个数。

例如:

int[]nums={10,20,30,40};System.out.println(nums.length);

输出:

4

注意:

数组长度:

nums.length

不是:

nums.length()

因为:

  • length 是数组属性;
  • length() 是方法。

例如:

String:

str.length();

数组:

arr.length;

二者不要混淆。

八、数组的遍历

数组遍历是数组使用中最常见的操作。

所谓遍历:按照一定顺序访问数组中的每一个元素。

例如:

数组:

int[]nums={10,20,30};

遍历结果:

102030

Java 中数组遍历主要有两种方式:

  • 普通 for 循环;
  • 增强 for 循环(foreach)。

8.1 使用普通 for 循环遍历

语法:

for(初始化;条件判断;更新){}

数组遍历:

int[]nums={10,20,30,40};for(inti=0;i<nums.length;i++){System.out.println(nums[i]);}

执行过程:

第一次:

i=0nums[0]10

第二次:

i=1nums[1]20

依次访问:

10203040

为什么使用 length?

推荐:

i<nums.length

不要写:

i<4

原因:

如果数组长度改变:

int[]nums=newint[100];

代码仍然可以正常运行。

8.2 增强 for 循环(foreach)

Java 提供了一种更加简洁的数组遍历方式。

语法:

for(数据类型 变量:数组){}

例如:

int[]nums={10,20,30,40};for(intnum:nums){System.out.println(num);}

输出:

10203040

执行过程:

第一次:num=10第二次:num=20第三次:num=30第四次:num=40

8.3 普通 for 和 foreach 对比

比较普通for增强for
是否需要索引需要不需要
能否修改元素可以不推荐
能否倒序遍历可以不可以
代码复杂度稍高简单

什么情况下使用普通 for?

例如:

需要修改数组元素:

for(inti=0;i<arr.length;i++){arr[i]+=10;}

需要通过索引访问:arr[i]

什么情况下使用 foreach?

只是读取数组:

for(intnum:arr){System.out.println(num);}

推荐使用 foreach。

九、数组常见异常

在平常写代码的时候经常会出现异常。

其中最常见的有两个:

  • 数组越界异常;
  • 空指针异常。

9.1 ArrayIndexOutOfBoundsException

中文:数组索引越界异常

原因:访问了不存在的索引。

例如:

int[]nums={10,20,30};System.out.println(nums[3]);

数组长度:

3

合法索引:

012

但是访问nums[3]不存在。

因此报错:ArrayIndexOutOfBoundsException

解决:

访问数组时不要超过数组长度。

尽量使用:

length-1

来确定长度。

9.2 NullPointerException

中文:空指针异常

例如:

int[]nums=null;System.out.println(nums.length);

运行报错:NullPointerException

为什么?

因为:nums没有指向任何数组对象。

访问nums.length相当于访问一个不存在的对象。

因此报错。

解决:

创建数组:

int[]nums=newint[5];

或者赋值:

int[]nums={1,2,3};

十、数组练习

10.1 数组求和

需求:计算数组所有元素之和。

代码:

publicstaticintsum(int[]arr){intsum=0;for(inti=0;i<arr.length;i++){sum+=arr[i];}returnsum;}

测试:

int[]nums={10,20,30};System.out.println(sum(nums));

结果:

60

10.2 求数组最大值

思路:假设第一个元素最大,然后依次比较。

代码:

publicstaticintmax(int[]arr){intmax=arr[0];for(inti=1;i<arr.length;i++){if(arr[i]>max){max=arr[i];}}returnmax;}

执行:

int[]nums={10,50,20,30};

结果:

50

10.3 数组元素查找(顺序查找)

需求:查找数组中是否存在某个元素。

例如:查找 30

代码:

publicstaticintsearch(int[]arr,inttarget){for(inti=0;i<arr.length;i++){if(arr[i]==target){returni;}}return-1;}

返回:

  • 找到:返回索引;
  • 没找到:返回 -1。

10.4 数组逆序

例如:

原数组:1 2 3 4 5

变成: 5 4 3 2 1

代码:

publicstaticvoidreverse(int[]arr){for(inti=0;i<arr.length/2;i++){inttemp=arr[i];arr[i]=arr[arr.length-1-i];arr[arr.length-1-i]=temp;}}

十一、Arrays 工具类

Java 提供了一个专门操作数组的工具类:java.util.Arrays它提供了大量数组操作方法。

使用前需要导入:import java.util.Arrays;

下面仅介绍几个常用的。

11.1 Arrays.toString()

作用:将数组转换成字符串。

例如:

int[]nums={10,20,30};System.out.println(Arrays.toString(nums));

输出:

[10,20,30]

否则

直接输出数组:

System.out.println(nums);

结果类似:

[I@1b6d3586

这是数组对象地址信息。

11.2 Arrays.sort()

作用:数组排序。

例如:

int[]nums={30,10,20};Arrays.sort(nums);System.out.println(Arrays.toString(nums));

结果:

[10,20,30]

默认:升序排序。

11.3 Arrays.equals()

作用:比较两个数组内容是否相同。

例如:

int[]a={1,2,3};int[]b={1,2,3};System.out.println(Arrays.equals(a,b));

结果:

true

注意:

不要使用:

a==b

因为:比较的是地址。

11.4 Arrays.copyOf()

作用:数组复制。

例如:

int[]nums={1,2,3};int[]copy=Arrays.copyOf(nums,5);

结果:

[1,2,3,0,0]

可以用于数组扩容。

十二、二维数组

12.1 什么是二维数组

二维数组本质上是:数组中的元素仍然是数组

也就是说:

二维数组就是:一个数组里面存放多个一维数组

例如:

int[][]arr;

可以理解为:

二维数组 一维数组 ↓[102030]一维数组 ↓[405060]一维数组 ↓[708090]

因此二维数组可以表示:

  • 表格;
  • 矩阵;
  • 多组数据。

二维数组的应用场景:

场景一:保存学生成绩

例如:

三个学生:

每个学生三门成绩:

语文 数学 英语 张三908588李四959290王五807885

可以表示为:

int[][]scores={{90,85,88},{95,92,90},{80,78,85}};

场景二:棋盘

例如:

五子棋棋盘:

000000102000100

可以使用二维数组保存。

12.2 二维数组定义

动态初始化

语法:

数据类型[][]数组名=new数据类型[行数][列数];

例如:

int[][]arr=newint[3][4];

表示创建:

  • 3 行;
  • 每行 4 个元素。

结构:

0123000001000020000

默认值:

因为是 int 类型,所有元素默认:0

静态初始化

语法:

数据类型[][]数组名={{元素1,元素2},{元素1,元素2}};

例如:

int[][]arr={{1,2,3},{4,5,6},{7,8,9}};

表示:

123456789

二维数组元素访问

二维数组访问:

数组名[行索引][列索引]

例如:

int[][]arr={{10,20,30},{40,50,60}};System.out.println(arr[0][1]);

执行:

先找:

第 0 行:10 20 30

再找:

第 1 列:20

输出:20

二维数组索引:

01201020301405060

访问:arr[1][2]

表示:第 2 行,第 3 个元素。

结果:60

12.3 二维数组遍历

二维数组遍历需要两层循环。

原因:外层循环控制行。内层循环控制列。

普通 for 循环遍历

例如:

publicclassDemo{publicstaticvoidmain(String[]args){int[][]arr={{10,20,30},{40,50,60},{70,80,90}};for(inti=0;i<arr.length;i++){for(intj=0;j<arr[i].length;j++){System.out.print(arr[i][j]+" ");}System.out.println();}}}

输出:

102030405060708090

执行过程:

第一次外层循环:i=0,访问:102030第二次:i=1,访问:405060

foreach 遍历二维数组

二维数组本质:数组里面套数组。

所以可以使用嵌套 foreach。

例如:

int[][]arr={{1,2,3},{4,5,6}};for(int[]row:arr){for(intnum:row){System.out.print(num+" ");}System.out.println();}

输出:

123456

12.4 二维数组内存分析

例如:

int[][]arr=newint[2][3];

很多人认为:二维数组是一整块连续空间。

实际上二维数组本质是:数组里面存放多个一维数组的引用。

创建过程:

第一步:创建外层数组arr,它保存两个元素。

第二步:创建两个一维数组。

内存如下图:

因此:

二维数组实际上包含:

  • 一个外层数组;
  • 多个内层数组。
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/27 6:44:43

大语言模型专业能力边界研究:LLMs Reward Expertise现象解析

这次我们来看一个关于大语言模型&#xff08;LLM&#xff09;能力边界的重要发现——LLMs Reward Expertise&#xff0c;即大语言模型在专业领域知识上的表现规律。这个研究揭示了模型在面对不同专业难度的问题时&#xff0c;其回答质量和可靠性存在显著差异&#xff0c;对于实…

作者头像 李华
网站建设 2026/7/27 6:44:33

深度学习新范式:嵌套学习与联想记忆系统解析

1. 深度学习的新视角&#xff1a;从"健忘症"到嵌套学习最近谷歌研究院Ali Behrouz团队发表的论文《Nested Learning》在AI领域掀起了一场思想风暴。作为一名长期跟踪深度学习技术发展的从业者&#xff0c;我读完这篇论文后深受震撼——它从根本上挑战了我们过去十年对…

作者头像 李华
网站建设 2026/7/27 6:44:21

CRC控制器中断与状态寄存器配置详解:从硬件原理到嵌入式实战

1. CRC控制器中断与状态寄存器深度解析&#xff1a;从硬件原理到实战配置在嵌入式系统开发&#xff0c;尤其是涉及数据通信、存储和固件安全验证的场景里&#xff0c;循环冗余校验&#xff08;CRC&#xff09;是一个你绕不开的“守门员”。它默默地在后台工作&#xff0c;确保每…

作者头像 李华
网站建设 2026/7/27 6:40:57

河洛数理:上古华夏的全域宇宙底层规律

一、总定义 河洛数理&#xff0c;不是玄学、不是占卜、不是古代算术。 它是上古华夏先民总结出的一套完整、自洽、全域通用的宇宙运行底层模型。 西方近代科学&#xff0c;是从局部拆解万物&#xff0c;将自然规律拆分、细化为数学、物理、流体、数论、计算机等独立分科。河洛数…

作者头像 李华
网站建设 2026/7/27 6:39:35

C++构建高性能气象数据可视化分析系统:架构设计与工程实践

1. 项目概述与核心价值最近在整理过往的项目资料&#xff0c;翻到了一个几年前做的气象数据可视化分析系统&#xff0c;用C写的。当时做这个项目的初衷&#xff0c;是想解决一个很实际的问题&#xff1a;我们手头有海量的、来自不同气象站和卫星的原始观测数据&#xff08;比如…

作者头像 李华
网站建设 2026/7/27 6:37:35

TMS320C40 DSP时序参数深度解析与通信端口硬件设计实战

1. 项目概述&#xff1a;从时序参数到通信端口设计的实战拆解在嵌入式系统&#xff0c;尤其是高性能数字信号处理&#xff08;DSP&#xff09;系统的硬件设计里&#xff0c;时序参数从来都不是数据手册里那些冰冷的数字表格&#xff0c;而是决定系统能否稳定跑起来、性能能否达…

作者头像 李华