【Java SE 基础学习打卡】37 二维数组
目录前言一、二维数组概述数组的数组存表格型数据的利器1.1 生活化类比1.2 编程定义1.3 直观结构以 3 行 2 列的成绩表为例二、二维数组的定义与初始化造好表格式收纳盒2.1 定义格式2 种推荐第 1 种2.2 静态初始化直接往表格里填全部数据2.3 动态初始化先定表格大小再填数据2.4 关键提醒静态 / 动态初始化不可混用三、二维数组的访问与遍历操作表格的每个单元格3.1 单个元素访问定位表格的 “行 列”3.2 二维数组的遍历遍历表格的所有单元格3.3 两种遍历方式对比新手选对不踩坑四、二维数组的长度外层行长度内层列长度可不一致五、二维数组的简单应用存储并打印班级各科成绩表六、新手必避的 5 个 “二维数组致命坑”6.1 坑 1行列索引搞反最常见6.2 坑 2遍历不规则数组内层用固定列数6.3 坑 3动态初始化不规则数组直接访问内层元素6.4 坑 4混淆二维数组的外层 / 内层长度6.5 坑 5 增强 for 循环试图修改二维数组元素总结前言上一节咱们吃透了一维数组的各种操作它像一个 “单排格子的收纳盒”适合存单列数据 —— 比如一个班级的数学成绩。但实际编程中更多是表格型数据比如班级学生的语文、数学、英语三科成绩行是学生列是科目、超市商品的名称和价格行是商品列是属性这时候一维数组就不够用了。二维数组就是为了解决这个问题而来它像一个 “多排多列的表格式收纳盒”本质是 “数组的数组”。这一节咱们从二维数组的核心概念入手讲清定义初始化、访问遍历、长度获取的规则重点说明 “内层数组长度可不一致” 的特点最后结合班级成绩表的实战场景让新手能落地使用二维数组处理表格数据一、二维数组概述数组的数组存表格型数据的利器1.1 生活化类比对比一维数组和二维数组用收纳盒 表格直观理解一维数组单排 5 格的收纳盒存 5 个学生的数学成绩单列数据二维数组3 行 3 列的表格收纳盒存 3 个学生的语数外三科成绩3 行 3 个学生3 列 3 科表格型数据。1.2 编程定义二维数组的本质是数组的数组外层是一个一维数组它的每个元素又都是一个一维数组内层数组。外层数组对应表格的行内层数组对应表格的列核心作用专门存储行、列结构的表格型数据比如成绩表、价目表、矩阵等。1.3 直观结构以 3 行 2 列的成绩表为例int[][]scores{{90,85},{88,92},{95,89}};// 外层数组行[ [90,85], [88,92], [95,89] ]// 内层数组列第0行[90,85]、第1行[88,92]、第2行[95,89]二、二维数组的定义与初始化造好表格式收纳盒和一维数组一致二维数组先定义再初始化定义有 2 种格式推荐规范写法初始化分静态知道所有数据和动态先定行列后续赋值且支持不规则二维数组内层数组长度不同。2.1 定义格式2 种推荐第 1 种推荐格式规范、直观一眼识别二维数组数据类型[][]数组名;示例int[][]scores;// 存整型成绩表double[][]prices;// 存浮点型价格表String[][]names;// 存字符串型二维数据兼容格式不推荐仅了解兼容 C/C 语法数据类型 数组名[][];示例intscores[][];// 效果同上可读性差2.2 静态初始化直接往表格里填全部数据适合已知所有表格数据的场景不用指定行列数系统会根据元素自动计算外层行和内层列长度支持规则 / 不规则二维数组。语法格式2 种同一维数组// 完整格式数据类型[][]数组名new数据类型[][]{{元素1,元素2},{元素3,元素4},...};// 简化格式常用声明时直接赋值数据类型[][]数组名{{元素1,元素2},{元素3,元素4},...};代码示例 1规则二维数组内层长度一致3 行 2 列// 3个学生2科成绩规则每行都是2列int[][]scores{{90,85},{88,92},{95,89}};代码示例 2不规则二维数组内层长度不一致重点二维数组的核心特性之一内层数组长度可以不同像 “参差不齐的表格”系统完全支持。// 第0行2列第1行3列第2行1列不规则int[][]nums{{1,2},{3,4,5},{6}};2.3 动态初始化先定表格大小再填数据适合只知道表格行列数数据后续确定的场景分 2 种情况新手优先掌握规则二维数组的初始化。方式 1规则二维数组指定总行数 总列数推荐一次性指定外层行和内层列长度所有内层数组长度一致系统会给每个元素赋默认值和一维数组默认值规则完全一致。语法格式数据类型[][]数组名new数据类型[总行数][总列数];代码示例3 行 3 列默认值都是 0后续赋值publicclassArray2DDynamic1{publicstaticvoidmain(String[]args){// 动态初始化3行3列的int二维数组所有元素默认0int[][]scoresnewint[3][3];// 手动给表格赋值行0列090第1个学生第1科scores[0][0]90;scores[0][1]85;scores[0][2]92;scores[1][0]88;// 未赋值的元素保持默认值0System.out.println(scores[1][1]);// 输出0}}方式 2不规则二维数组先定行数再逐个初始化列数先指定外层数组长度总行数内层数组暂时为 null后续手动为每一行指定不同的列数实现不规则二维数组。语法格式// 1. 先定总行数内层数组未初始化数据类型[][]数组名new数据类型[总行数][];// 2. 逐个初始化内层数组列数可不同数组名[0]new数据类型[列数1];数组名[1]new数据类型[列数2];代码示例3 行列数分别为 2、3、1publicclassArray2DDynamic2{publicstaticvoidmain(String[]args){// 1. 先定3行内层数组暂为nullint[][]numsnewint[3][];// 2. 逐个初始化列数实现不规则nums[0]newint[2];// 第0行2列nums[1]newint[3];// 第1行3列nums[2]newint[1];// 第2行1列// 赋值并访问nums[0][1]5;nums[1][2]8;System.out.println(nums[0][1]);// 输出5System.out.println(nums[1][2]);// 输出8}}2.4 关键提醒静态 / 动态初始化不可混用和一维数组一样不能既指定行列数又直接填元素编译直接报错// 错误示例规则动态初始化静态赋值混用报错int[][]scoresnewint[3][2]{{90,85},{88,92}};三、二维数组的访问与遍历操作表格的每个单元格3.1 单个元素访问定位表格的 “行 列”二维数组的每个元素对应表格的一个单元格通过 “行索引 列索引” 精准访问行、列索引都从0开始支持赋值和取值。核心语法// 取值数组名[行索引][列索引]数组名[行索引][列索引];// 赋值数组名[行索引][列索引] 对应类型值;数组名[行索引][列索引]值;代码示例3 行 2 列成绩表存取操作publicclassArray2DAccess{publicstaticvoidmain(String[]args){int[][]scores{{90,85},{88,92},{95,89}};// 取值第0行第1列第1个学生第2科intscore1scores[0][1];System.out.println(第1个学生第2科成绩score1);// 输出85// 赋值修改第2行第0列第3个学生第1科为98scores[2][0]98;System.out.println(修改后第3个学生第1科成绩scores[2][0]);// 输出98}}3.2 二维数组的遍历遍历表格的所有单元格二维数组是 “数组的数组”遍历需要双重循环外层循环控制行内层循环控制列常用 2 种方式根据场景选择。方式 1双重普通 for 循环万能遍历可改元素、获索引适用场景需要行 / 列索引的场景比如求某行 / 某列的和想要修改二维数组的元素值支持不规则二维数组内层用arr[i].length控制列数。代码示例遍历 3 行 2 列规则数组修改元素 打印publicclassArray2DFor{publicstaticvoidmain(String[]args){int[][]scores{{90,85},{88,92},{95,89}};System.out.println(遍历并修改成绩每题加2分);// 外层循环控制行i是行索引for(inti0;iscores.length;i){// 内层循环控制列j是列索引scores[i].length是第i行的列数for(intj0;jscores[i].length;j){scores[i][j]2;// 所有成绩加2分System.out.print(scores[i][j] );// 打印每行的元素}System.out.println();// 每行打印完换行保持表格格式}}}执行结果保持表格样式遍历并修改成绩每题加2分928790949791方式 2双重增强 for 循环foreach只读遍历代码简洁适用场景仅需要读取所有元素值不需要修改不需要行 / 列索引仅打印表格数据代码更简洁无需关注索引降低越界风险。核心逻辑外层增强 for 循环遍历外层数组每次获取一行一个内层一维数组内层增强 for 循环遍历当前行的内层数组每次获取一个单元格的值。代码示例仅读取并打印不规则二维数组publicclassArray2DForeach{publicstaticvoidmain(String[]args){// 不规则二维数组第0行2列第1行3列第2行1列int[][]nums{{1,2},{3,4,5},{6}};System.out.println(双重增强for循环遍历不规则数组);// 外层遍历每一行row是每个内层一维数组for(int[]row:nums){// 内层遍历当前行的每个元素for(intnum:row){System.out.print(num );}System.out.println();// 换行保持表格格式}}}执行结果双重增强for循环遍历不规则数组1234563.3 两种遍历方式对比新手选对不踩坑遍历方式能否获行 / 列索引能否修改元素能否适配不规则数组代码简洁度双重普通 for 循环能能能用 arr [i].length稍繁琐双重增强 for 循环不能不能能自动适配很简洁四、二维数组的长度外层行长度内层列长度可不一致新手最容易混淆二维数组的长度记住核心规则二维数组有两个长度外层是行数内层是对应行的列数且内层列数可不同不规则数组。核心语法数组名.length;// 外层长度二维数组的总行数数组名[行索引].length;// 内层长度第行索引行的总列数代码示例规则 不规则数组打印长度publicclassArray2DLength{publicstaticvoidmain(String[]args){// 1. 规则二维数组3行2列int[][]scores{{90,85},{88,92},{95,89}};System.out.println(规则数组-总行数scores.length);// 外层长度3System.out.println(规则数组-第0行列数scores[0].length);// 内层长度2System.out.println(规则数组-第2行列数scores[2].length);// 内层长度2// 2. 不规则二维数组3行列数2/3/1int[][]nums{{1,2},{3,4,5},{6}};System.out.println(\n不规则数组-总行数nums.length);// 外层长度3System.out.println(不规则数组-第0行列数nums[0].length);// 内层长度2System.out.println(不规则数组-第1行列数nums[1].length);// 内层长度3System.out.println(不规则数组-第2行列数nums[2].length);// 内层长度1}}执行结果规则数组-总行数3规则数组-第0行列数2规则数组-第2行列数2不规则数组-总行数3不规则数组-第0行列数2不规则数组-第1行列数3不规则数组-第2行列数1关键避坑遍历不规则数组内层循环必须用arr[i].length如果内层循环用固定值或外层长度会触发索引越界异常// 错误示例遍历不规则数组内层用固定值3第0行只有2列访问nums[0][2]报错for(inti0;inums.length;i){for(intj0;j3;j){System.out.print(nums[i][j] );}}五、二维数组的简单应用存储并打印班级各科成绩表结合以上所有知识点做一个实战场景存储 3 个学生的语、数、外三科成绩打印标准成绩表并计算每个学生的总分新手可直接运行代码落地掌握。完整代码publicclassArray2DApp{publicstaticvoidmain(String[]args){// 1. 静态初始化3个学生行语数外3科列int[][]scores{{90,85,92},{88,92,89},{95,89,96}};// 打印表头System.out.println( 班级成绩表 );System.out.println(学生\t语文\t数学\t英语\t总分);System.out.println();// 2. 双重普通for循环遍历计算每个学生总分并打印for(inti0;iscores.length;i){intsum0;// 每个学生的总分每行初始化一次System.out.print(第(i1)个\t);// 打印学生序号for(intj0;jscores[i].length;j){sumscores[i][j];// 累加各科成绩求总分System.out.print(scores[i][j]\t);// 打印各科成绩}System.out.println(sum);// 打印当前学生总分换行}System.out.println();}}执行结果标准表格格式班级成绩表学生 语文 数学 英语 总分第1个908592267第2个889289269第3个958996280六、新手必避的 5 个 “二维数组致命坑”6.1 坑 1行列索引搞反最常见错误示例想访问第 0 行第 1 列写成列索引在前scores[1][0];// 原本想取第1个学生第2科实际取第2个学生第1科避坑记死顺序数组名 [行索引][列索引]行在前列在后。6.2 坑 2遍历不规则数组内层用固定列数错误示例内层循环用固定值导致索引越界for(intj0;j3;j){}// 不规则数组某行不足3列直接报错避坑内层循环固定写j 数组名[i].length自动适配每行的列数。6.3 坑 3动态初始化不规则数组直接访问内层元素错误示例只定行数未初始化内层数组直接赋值int[][]numsnewint[3][];nums[0][0]1;// 内层数组为null运行时报空指针异常避坑先初始化内层数组再访问 / 赋值nums[0] new int[2]; nums[0][0] 1;。6.4 坑 4混淆二维数组的外层 / 内层长度错误示例想取列数直接用数组名.lengthintcolscores.length;// 实际取的是行数3不是列数2避坑列数没有统一值取指定行的列数scores[0].length。6.5 坑 5 增强 for 循环试图修改二维数组元素错误示例以为修改内层变量能改变原数组for(int[]row:scores){for(intnum:row){num2;// 仅修改临时变量原数组无变化}}避坑要修改二维数组元素必须用双重普通 for 循环。总结这一节咱们掌握了二维数组的核心知识和实操技能记住 4 个核心点本质与作用数组的数组用于存储行列表格型数据外层是行内层是列初始化静态已知所有数据、动态先定行列支持不规则数组内层长度不同访问与遍历行 列索引定位元素双重普通 for 循环可改元素双重增强 for 循环仅只读长度规则数组名.length是总行数数组名[i].length是第 i 行的列数内层可不一致。二维数组是处理结构化数据的基础掌握后能应对大部分批量表格数据的存储和操作场景。

相关新闻

【贪嗔痴】低频量化周报(指数风险溢价比,配债完整数据集,可转债策略,上市公司礼品,交易总结)

【贪嗔痴】低频量化周报(指数风险溢价比,配债完整数据集,可转债策略,上市公司礼品,交易总结)

低频量化周报&#xff08;2026-01-30&#xff09;指数风险溢价比小规模配债<5亿配债完整数据5 批文通过4 发哥通过3 交易所受理2 股东大会通过1 董事会预案可转债策略双低策略低溢价策略小盘低价格策略小盘低溢价策略溢价偏离策略上市公司实物礼品孚日股份(002083)2026-01-2…

2026/7/3 15:01:33 阅读更多 →
豆包和InfiniSynapse 联网搜索哪家强:一起寻找元气

豆包和InfiniSynapse 联网搜索哪家强:一起寻找元气

今天我无意在群里看到如下一段对话&#xff1a;发这个截图的朋友其实是想展示&#xff0c;其实豆包完全可以替代搜索&#xff0c;而且还没广告。但是如果搜索结果返回的不太好&#xff0c;比如信息有冲突之类的&#xff0c;其实大家应该能够感受到&#xff0c;像豆包/DeepSeek …

2026/7/3 15:01:34 阅读更多 →
【完全免费】一键锁定电脑键盘和鼠标,防止小孩舍友同事触碰自己的电脑。如何让电脑键盘鼠标失效?这款神器轻松帮你解决!

【完全免费】一键锁定电脑键盘和鼠标,防止小孩舍友同事触碰自己的电脑。如何让电脑键盘鼠标失效?这款神器轻松帮你解决!

——软件使用教程—— 一键锁定电脑键盘和鼠标&#xff0c;防止小孩舍友同事触碰自己的电脑。——下载地址&#xff08;防止被拦截&#xff0c;请用浏览器打开&#xff09;—— 夸克地址&#xff1a; https://pan.dxlszyk.com/s/1jghdt106 多盘地址&#xff1a; https://ww…

2026/7/3 15:01:38 阅读更多 →

最新新闻

Spring Cloud OpenFeign负载均衡算法深度解析:源码、可扩展性与面试题

Spring Cloud OpenFeign负载均衡算法深度解析:源码、可扩展性与面试题

本文深入剖析Spring Cloud OpenFeign的负载均衡机制&#xff0c;从核心组件架构、RoundRobin/Random/Weighted等算法源码、ServiceInstanceListSupplier装饰器模式的可扩展性设计&#xff0c;到自定义负载均衡实战&#xff0c;最后附带10道高频面试题及答案剖析&#xff0c;助你…

2026/7/3 16:26:33 阅读更多 →
直流电机静音控制方案设计与实现

直流电机静音控制方案设计与实现

1. 项目概述&#xff1a;直流电机静音控制方案设计 在工业自动化和消费电子领域&#xff0c;直流电机的噪声问题一直是工程师面临的常见挑战。传统PWM控制方式虽然简单高效&#xff0c;但开关噪声和电磁干扰问题尤为突出。本项目采用东芝TB9051FTG电机驱动IC搭配德州仪器TM4C12…

2026/7/3 16:26:33 阅读更多 →
基于STM32单片机宠物自动喂食系统喂水控制系统 WIFI监控宠物喂养1(设计源文件+万字报告+讲解)(支持资料、图片参考_降重降ai)

基于STM32单片机宠物自动喂食系统喂水控制系统 WIFI监控宠物喂养1(设计源文件+万字报告+讲解)(支持资料、图片参考_降重降ai)

基于STM32单片机宠物自动喂食系统喂水控制系统 WIFI监控宠物喂养1(设计源文件万字报告讲解)&#xff08;支持资料、图片参考_降重降ai&#xff09; 版本0 &#xff1a;5个定时喂食喂食提醒自动/手动模式TFT液晶显示年&#xff0c;月&#xff0c;日&#xff0c;十&#xff0c;分…

2026/7/3 16:24:33 阅读更多 →
ICM-42688-P运动传感器与PIC18F4455在工业自动化中的应用

ICM-42688-P运动传感器与PIC18F4455在工业自动化中的应用

1. ICM-42688-P运动传感器的技术解析 ICM-42688-P是一款六轴运动传感器&#xff0c;集成了三轴陀螺仪和三轴加速度计。这款传感器在工业应用中表现出色&#xff0c;主要得益于以下几个关键技术特性&#xff1a; 1.1 高精度运动检测能力 ICM-42688-P的陀螺仪量程可达2000dps&a…

2026/7/3 16:24:33 阅读更多 →
STM32G031K8与KMX62 IMU在运动控制中的实践应用

STM32G031K8与KMX62 IMU在运动控制中的实践应用

1. 项目背景与核心价值在工业自动化、机器人技术和消费电子领域&#xff0c;稳定性和平衡控制一直是关键挑战。传统方案往往采用分立式传感器搭配复杂算法&#xff0c;不仅成本高企&#xff0c;调试周期也漫长。KMX62作为一款6自由度(6DOF)惯性测量单元(IMU)&#xff0c;结合ST…

2026/7/3 16:22:33 阅读更多 →
零售收款机安全漏洞深度解析与实战加固指南

零售收款机安全漏洞深度解析与实战加固指南

1. 项目概述&#xff1a;为什么收款机安全不容忽视你可能觉得&#xff0c;一台小小的收款机&#xff0c;不就是收个钱、打个单吗&#xff1f;能有什么大不了的漏洞&#xff1f;我干了十几年零售和餐饮系统的技术运维&#xff0c;见过太多因为忽视收款机安全而“翻车”的案例。从…

2026/7/3 16:22:33 阅读更多 →

日新闻

Nginx防御TLS重协商攻击实战:从原理到配置与监控

Nginx防御TLS重协商攻击实战:从原理到配置与监控

1. 项目概述&#xff1a;为什么TLS重协商攻击至今仍需警惕十多年前的CVE-2011-1473&#xff0c;一个关于TLS/SSL协议重协商机制的漏洞&#xff0c;现在提起来还有必要吗&#xff1f;很多运维和开发朋友可能会觉得&#xff0c;这都老掉牙了&#xff0c;现代服务器和客户端不都默…

2026/7/3 0:03:59 阅读更多 →
华为防火墙双通道远程管理实战:Web与SSH配置详解

华为防火墙双通道远程管理实战:Web与SSH配置详解

1. 项目概述&#xff1a;为什么需要双通道远程管理防火墙&#xff1f;在任何一个稍具规模的企业网络里&#xff0c;防火墙都是那个默默守护在边界的关键角色。作为网络工程师&#xff0c;我们不可能每次都跑到机房&#xff0c;插上console线去配置它。远程管理能力&#xff0c;…

2026/7/3 0:03:59 阅读更多 →
AD74413R与PIC18F65K40的高精度工业数据采集方案

AD74413R与PIC18F65K40的高精度工业数据采集方案

1. 项目概述&#xff1a;AD74413R与PIC18F65K40的协同工作在工业自动化和精密测量领域&#xff0c;同时实现高精度模数转换(ADC)和数模转换(DAC)功能是许多复杂系统的核心需求。AD74413R作为一款四通道可配置模拟输入/输出器件&#xff0c;与PIC18F65K40微控制器的组合&#xf…

2026/7/3 0:05:59 阅读更多 →

周新闻

月新闻