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

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,它保存两个元素。

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

内存如下图:

因此:

二维数组实际上包含:

  • 一个外层数组;
  • 多个内层数组。
http://www.cnnetsun.cn/news/3677729.html

相关文章:

  • 大语言模型专业能力边界研究:LLMs Reward Expertise现象解析
  • 深度学习新范式:嵌套学习与联想记忆系统解析
  • CRC控制器中断与状态寄存器配置详解:从硬件原理到嵌入式实战
  • 河洛数理:上古华夏的全域宇宙底层规律
  • C++构建高性能气象数据可视化分析系统:架构设计与工程实践
  • TMS320C40 DSP时序参数深度解析与通信端口硬件设计实战
  • 超精度计算与Excel体验融合:SpreadJS技术解析
  • gfx936 DCU上实现INT8 QK MMAC:分页访存、Fragment映射与GQA适配
  • WorkshopDL:跨平台Steam创意工坊模组下载的完整解决方案
  • Go语言时间格式化原理与实践指南
  • AIGC技术解析:从原理到行业应用实战
  • 强化学习在神经架构搜索与业务流程优化中的应用
  • 深入了解网工学习框架(初)
  • CUDA源码在苹果GPU运行:跨架构兼容性技术解析
  • 半监督学习:降低AI数据标注成本的核心技术
  • LoRA/QLoRA技术解析:大模型轻量化微调实战
  • 一张白底图成本从¥15→¥0.37?(2024头部MCN内部AI白底流水线全拆解,含Lora训练数据集链接)
  • 放弃复杂命令!Windows 可视化安装 OpenClaw,小白狂喜
  • AI在企业办公中的8大核心应用场景与实施策略
  • 船舶操纵运动仿真与Nomoto模型MATLAB实现
  • Matlab实现人工势场算法在无人机路径规划中的应用
  • TI TMS320C672x浮点DSP硬件设计实战:从电源时序到PCB布线的避坑指南
  • OpenAI Codex技术解析:从GPT-3到智能编程助手的实战应用
  • Linux下MySQL与Redis服务启动问题排查指南
  • TMS320C674x DSP引脚复用配置详解:从原理到电机控制与音频接口实战
  • 强化学习笔记3--最优贝尔曼、蒙特卡洛
  • 深入解析MibSPI中断向量与并行模式寄存器配置
  • 本地部署千问3.6,用WorkBuddy 10分钟搞定年中总结PPT(附双V100_16G实战配置)
  • AI模型推理延迟优化:从剪枝量化到硬件加速
  • AI智能体开发实战:从架构设计到部署优化