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

Java数组入门教程:零基础掌握数组定义与遍历+新手避坑指南

之前咱们学了循环,能让程序重复干活了,但如果要存一堆同类型的数据,比如一个班 10 个学生的成绩,总不能定义 10 个 int 变量吧?那也太麻烦了!今天咱们就来学个能 “打包存数据” 的工具 ——Java 里的数组,有了它,再多同类型数据都能整整齐齐存一起,操作起来还方便。

先说说数组到底是啥。简单说就是 “相同数据类型的元素组成的有序集合”,听着有点官方?说白了就是一个 “统一规格的抽屉柜”,每个抽屉只能放同一种东西(比如全是整数成绩),每个抽屉还有个编号(专业叫 “索引”),想拿哪个直接按编号找就行。比如存 10 个学生成绩,用数组的话,就不用写 int score1、score2……score10,直接一个数组就能搞定,是不是省事儿多了?

那数组怎么定义呢?主要有两种方式,咱们一个个说。第一种是 “动态初始化”,先确定数组长度,之后再给每个元素赋值。格式是 “数据类型 [] 数组名 = new 数据类型 [数组长度];”。比如要存 5 个学生的数学成绩,就可以写 “int [] mathScores = new int [5];”。这里的 “5” 就是数组长度,意思是这个数组能存 5 个 int 类型的数据。但要注意,刚定义好的数组,元素会有默认值 ——int 类型默认是 0,double 默认是 0.0,boolean 默认是 false,String 默认是 null。所以刚创建的 mathScores 数组,里面装的其实是 [0,0,0,0,0],得手动给它赋值。

怎么赋值呢?得通过索引来操作。你想想看,数组的索引就像抽屉的编号,但有个特别重要的点:索引是从 0 开始的,不是 1!比如刚才的 mathScores 数组,5 个元素的索引是 0、1、2、3、4,不是 1 到 5。要是想给第一个学生的成绩赋值 95,就得写 “mathScores [0] = 95;”;给第三个学生赋值 88,就是 “mathScores [2] = 88;”。小索奇当初第一次用数组,就犯了个低级错误 —— 想给第五个元素赋值,写成了 “mathScores [5] = 76;”,结果一运行直接报错 “ArrayIndexOutOfBoundsException”(数组索引越界异常),查了半天才明白索引从 0 开始,第五个元素的索引是 4,现在想起来还觉得有点好笑。

第二种定义方式是 “静态初始化”,直接在创建数组的时候给元素赋值,不用写长度,Java 会自动根据元素个数算长度。格式有两种,一种是 “数据类型 [] 数组名 = new 数据类型 []{元素 1, 元素 2, 元素 3……};”,比如 “int [] mathScores = new int []{95, 88, 76, 92, 85};”;还有一种更简洁的,“数据类型 [] 数组名 = {元素 1, 元素 2, 元素 3……};”,比如 “int [] mathScores = {95, 88, 76, 92, 85};”。这种方式适合一开始就知道所有元素值的情况,比如你已经统计好了 5 个学生的成绩,直接这么写就行,不用再一个个赋值,效率更高。

数组定义好之后,怎么看它的长度呢?不用自己数元素个数,数组有个自带的 “length” 属性,直接用 “数组名.length” 就能获取长度。比如刚才的 mathScores 数组,“mathScores.length” 的结果就是 5。这个属性特别有用,尤其是在循环遍历数组的时候,比如想把所有学生的成绩打印出来,用 for 循环结合 length 写,就不用硬写循环次数,就算数组长度变了,代码也不用改。比如:

for (int i = 0; i < mathScores.length; i++) {

System.out.println ("第" + (i+1) + "个学生的成绩:" + mathScores [i]);

}

这里 i 从 0 跑到 mathScores.length-1(也就是 4),正好遍历所有元素,打印的时候把 i+1,就能显示 “第 1 个”“第 2 个”,符合咱们平时的习惯,是不是很灵活?

除了遍历,数组还能做很多操作,比如找最大值。比如想从 mathScores 数组里找出最高成绩,思路很简单:先假设第一个元素是最大值(mathScores [0]),然后用循环把每个元素和它比,如果某个元素比它大,就更新最大值。代码可以这么写:

int maxScore = mathScores [0]; // 假设第一个元素是最大值

for (int i = 1; i < mathScores.length; i++) {

if (mathScores [i] > maxScore) {

maxScore = mathScores [i]; // 更新最大值

}

}

System.out.println ("最高成绩是:" + maxScore);

你可以把数组里的元素改改,比如加个 98 进去,运行看看能不能正确找到最大值,亲测有效哦~

不过数组也有个 “小缺点”—— 长度一旦确定,就没法改了。比如你定义了长度为 5 的 mathScores 数组,后来想再加一个学生的成绩,直接加是不行的,只能重新创建一个更长的数组,把原来的元素复制过去。比如想把长度改成 6,可以这么写:

int [] newMathScores = new int [6]; // 新数组长度 6

// 把原数组元素复制到新数组

for (int i = 0; i < mathScores.length; i++) {

newMathScores [i] = mathScores [i];

}

newMathScores [5] = 89; // 加新成绩

这时候 newMathScores 数组就是 [95,88,76,92,85,89] 了。说到这儿可能有人会问,那有没有能自动变长度的 “数组” 呀?其实 Java 里有个叫 “ArrayList” 的东西,后面咱们学到集合的时候会讲,现在先把基础数组用熟就行。

最后再跟你说几个新手常踩的数组坑。第一个就是刚才说的索引越界,比如数组长度 5,非要访问索引 5,这是最常见的错误,一定要记住 “索引 = 元素位置 - 1”;第二个是空指针异常,比如你写了 “int [] mathScores = null;”,然后直接访问 “mathScores [0]”,就会报错,因为 “null” 表示数组没指向任何内存空间,不是 “空数组”,空数组得写成 “int [] mathScores = new int [0];”;第三个是数组元素类型不匹配,比如定义了 int 数组,非要给它赋值 “abc”,Java 肯定不答应,类型必须统一。

小索奇觉得,数组是 Java 里处理批量数据的基础,学会了它,后面处理列表、表格类的数据会轻松很多。你可以试着自己练一练:用数组存 3 个同学的身高(double 类型),然后遍历打印出来,再算出平均身高。

你在写数组的时候,有没有遇到过索引越界或者空指针异常的情况?当时是怎么解决的?又或者对数组的用法还有什么疑问,都可以在评论区说说,咱们一起把这些问题搞明白~

http://www.xdnf.cn/news/19339.html

相关文章:

  • Python3 lambda(匿名函数)
  • 轻量xlsx读取库xlsx_drone的编译与测试
  • 元素滚动scrollIntoView
  • A5M2(数据库管理工具)下载安装
  • 谈物质的运动与运动的物质
  • 智能消防栓闷盖终端:让城市消防管理更智慧高效
  • Robolectric拿到当前的Activity
  • 基于轴重转移补偿和多轴协调的粘着控制方法研究
  • 线性回归算法
  • Lombok(简化Java当中的开发)
  • 下载 | Win11 23H2正式版最新原版ISO系统映像 (22631.5840、多合一版本)-修复系统问题
  • 基于STM32单片机的OneNet物联网云平台农业土壤湿度控制系统
  • 编程与数学 03-004 数据库系统概论 09_物理结构设计
  • 栈溢出问题
  • 498. 对角线遍历
  • 银河麒麟系统无法打开360浏览器的解决办法以及安装initramfs-tools报错解决方案
  • 10.2 工程学中的矩阵
  • AutoDriveRelated-WA
  • Qt中的锁(1)
  • 【lua】table基础操作
  • String str = new String(“abc“)
  • C语言---零碎语法知识补充(队列、函数指针、左移右移、任务标识符)
  • 第十六章 ESP32S3 WATCH_DOG 实验
  • C++优先级队列priority_queue的模拟实现
  • 论文介绍:《Small Language Models are the Future of Agentic AI》
  • Python(五)Python_C API详细
  • Linux三剑客grep-sed-awk
  • 为什么vue3会移除过滤器filter
  • 北斗导航 | RAIM算法改进方案及性能对比分析报告
  • 深度学习:洞察发展趋势,展望未来蓝图