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