3.1 数组概述数组是一个容器可以存放多个相同类型的数据。比如用数组存放全班50个同学的年龄整数或一周七天的名称字符串。为什么需要数组没有数组存5个考试成绩要定义5个变量intscore185;intscore292;intscore378;intscore490;intscore588;50个人就得写50个变量。有了数组一切简单得多。博主小贴士数组像一排储物格每个格子有下标索引从0开始。数组下标从0开始这是新手最容易犯错的地方3.2 一维数组一维数组就是最简单、最基础的一排格子。我们一步步来学习怎么用它。3.2.1 一维数组的声明语法数据类型[]数组名;// 或者数据类型 数组名[];通常用第一种方式。例子int[]scores;// 存放整数成绩String[]names;// 存放字符串姓名double[]prices;// 存放小数价格博主小贴士声明数组时并没有真正创建出格子只是告诉Java有这么一个容器概念。3.2.2 一维数组的创建使用new关键字指定数组长度int[]scores;// 1. 声明scoresnewint[5];// 2. 创建长度为5的数组也可合并int[]scoresnewint[5];// 声明并创建创建时Java自动赋默认值整数类型0小数类型0.0布尔类型false字符类型\u0000引用类型如Stringnull3.2.3 一维数组的使用通过下标索引存取元素scores[0]85;// 赋值intfirstScorescores[0];// 取值静态初始化int[]scores{85,92,78,90,88};// 声明、创建、赋值一步到位完整示例publicclassArrayDemo{publicstaticvoidmain(String[]args){int[]scoresnewint[5];scores[0]85;scores[1]92;scores[2]78;scores[3]90;scores[4]88;System.out.println(第一位同学的成绩是scores[0]);// 85scores[2]99;System.out.println(修改后第三位同学的成绩是scores[2]);// 99}}博主小贴士数组下标越界是常见错误长度为5的数组下标0-4访问scores[5]会报ArrayIndexOutOfBoundsException。记住下标范围是 0 到 长度-1。3.2.4 一维数组的遍历使用for循环配合数组名.lengthpublicclassArrayTraversal{publicstaticvoidmain(String[]args){int[]scores{85,92,78,90,88};for(inti0;iscores.length;i){System.out.println(第(i1)位同学的成绩是scores[i]);}}}输出第1位同学的成绩是85 第2位同学的成绩是92 第3位同学的成绩是78 第4位同学的成绩是90 第5位同学的成绩是883.2.5 一维数组的内存分配这部分稍微有点抽象但用大白话讲就很简单了。想象一下你的电脑内存就像一个巨大的、有很多房间的公寓楼。栈Stack公寓楼的前台。前台空间小但办事快。它主要存放基本类型的变量和对象的引用可以理解为房间的“门牌号”。堆Heap公寓楼里的房间。房间空间大可以放很多东西。它主要存放真正的对象比如数组、字符串等。当我们执行int[] scores new int[5];时发生了什么new int[5]在堆里开辟了5个连续的“房间”格子每个房间都能放一个int值并自动初始化为0。int[] scores在栈里创建了一个叫scores的变量但这个变量里存的不是数组本身而是数组在堆内存中的地址门牌号比如0x7e9。把堆内存的地址0x7e9赋值给栈里的scores变量。这样scores就指向了堆里的那个数组。所以当你用scores[0]时Java会先通过scores找到堆里的数组然后再找到第0个格子。博主小贴士理解栈和堆对以后理解“空指针异常”NullPointerException很有帮助。如果你只声明了int[] scores;但没有new那scores在栈里就是一个空的门牌号null你拿着空门牌号去找房间当然会报错啦课堂练习1请编写一个Java程序完成以下步骤创建一个长度为10的int类型数组。使用for循环为数组的每个元素赋值为1到10。再使用一个for循环计算并打印出数组中所有元素的总和。3.3 多维数组多维数组可以理解为“数组的数组”。最常见的是二维数组就像一张表格有行有列。3.3.1 多维数组的声明// 声明一个二维数组int[][]matrix;// 推荐写法intmatrix[][];// 也可以3.3.2 多维数组的创建// 创建一个3行4列的二维数组matrixnewint[3][4];这就像创建了一个有3行、每行有4个格子的表格。3.3.3 多维数组的使用通过两个下标来定位数组名[行号][列号]。publicclassTwoDArrayDemo{publicstaticvoidmain(String[]args){// 创建一个3行4列的二维数组并静态初始化int[][]matrix{{1,2,3,4},{5,6,7,8},{9,10,11,12}};// 访问第2行第3列的元素行和列下标都从0开始System.out.println(第2行第3列的元素是matrix[1][2]);// 输出7// 使用嵌套for循环遍历二维数组// matrix.length 是行数3// matrix[i].length 是第i行的列数4for(inti0;imatrix.length;i){for(intj0;jmatrix[i].length;j){System.out.print(matrix[i][j]\t);// \t是制表符让输出对齐}System.out.println();// 每打印完一行换行}}}输出1 2 3 4 5 6 7 8 9 10 11 12和一维数组的区别一维数组是一排格子二维数组是一张表格多排格子。一维数组用1个下标定位二维数组用2个下标定位。可以把二维数组想象成每个“格子”里又放了一个一维数组。3.3.4 多维数组的内存分配二维数组在内存中其实是一个“数组的数组”。在堆里有一个“主数组”它有3个元素对应3行。这3个元素每个都是一个引用门牌号分别指向堆里的另外3个一维数组每行有4个格子。博主小贴士二维数组的每一行长度可以不一样这就是我们接下来要讲的不规则数组。课堂练习2请编写一个Java程序创建一个4行4列的二维数组并按照以下规则赋值对角线上的元素行号列号赋值为1。其他元素赋值为0。然后打印这个数组。3.4 不规则数组不规则数组也叫“锯齿数组”它的特点是二维数组的每一行长度可以不同。创建方式publicclassRaggedArrayDemo{publicstaticvoidmain(String[]args){// 1. 先创建主数组指定有3行但先不指定每行的列数int[][]raggednewint[3][];// 2. 分别创建每一行并指定不同的长度ragged[0]newint[2];// 第一行有2个元素ragged[1]newint[4];// 第二行有4个元素ragged[2]newint[3];// 第三行有3个元素// 3. 赋值并遍历intvalue1;for(inti0;iragged.length;i){for(intj0;jragged[i].length;j){ragged[i][j]value;System.out.print(ragged[i][j] );}System.out.println();}}}输出1 2 3 4 5 6 7 8 9应用场景比如你要存储一个班级里每个小组的成员姓名。第一组有3个人第二组有5个人第三组有2个人。用不规则数组就非常合适。博主小贴士不规则数组在遍历时内层循环的条件一定要用ragged[i].length而不是一个固定的数字否则会下标越界。本章小结数组是一个容器用于存储相同类型的多个数据。一维数组是最基础的数组通过下标从0开始访问元素。数组的长度是固定的创建后不能改变。遍历数组最常用的方法是for循环配合数组名.length属性。二维数组是“数组的数组”常用于表示表格数据。不规则数组允许二维数组的每一行有不同的长度。理解栈和堆的内存分配有助于理解数组的引用和常见的 NullPointerExcepti习题一、选择题以下哪个是创建长度为10的int数组的正确方式A.int arr new int[10];B.int[] arr new int[10];C.int arr[] new int(10);D.int[] arr new int[9];答案B解析A 选项 ❌int arr声明的是一个基本类型int变量而不是数组。new int[10]返回的是数组对象不能赋值给int类型变量编译会报错。B 选项 ✅int[] arr声明了一个int类型的数组引用new int[10]创建了一个长度为10的数组对象并将引用赋值给arr这是标准写法。C 选项 ❌int arr[]虽然也是声明数组的合法语法C语言风格但new int(10)使用了圆括号()这是创建单个对象时用的语法。创建数组必须使用方括号[]因此编译错误。D 选项 ❌语法本身正确但创建的是长度为9的数组不符合题目要求的「长度为10」。已知int[] arr {10, 20, 30, 40, 50};那么arr[3]的值是多少A. 10B. 20C. 30D. 40答案D解析Java 数组的索引从0开始因此arr[0] 10arr[1] 20arr[2] 30arr[3] 40arr[4] 50所以arr[3]的值是 40对应选项 D。以下代码会引发什么异常int[]arrnewint[3];System.out.println(arr[3]);A. NullPointerExceptionB. ArrayIndexOutOfBoundsExceptionC. NumberFormatExceptionD. 正常运行输出0答案B解析数组arr的长度为3有效索引范围是0、1、2。代码试图访问arr[3]即第4个元素超出了数组的索引范围0~2。Java 虚拟机在运行时检测到数组越界访问会抛出ArrayIndexOutOfBoundsException数组索引越界异常。A 选项 ❌NullPointerException发生在对null对象调用方法或访问属性时这里arr已被正确初始化不为null。C 选项 ❌NumberFormatException发生在将字符串转换为数字但格式不合法时与此场景无关。D 选项 ❌程序会抛出异常并终止不会正常输出任何值。二、代码填空题请补全以下代码使其能正确遍历并打印数组nums的所有元素。publicclassFillBlank{publicstaticvoidmain(String[]args){int[]nums{1,2,3,4,5};for(inti0;i______;i){System.out.println(______);}}}答案publicclassFillBlank{publicstaticvoidmain(String[]args){int[]nums{1,2,3,4,5};for(inti0;inums.length;i){System.out.println(nums[i]);}}}解析第一个空nums.lengthnums.length是数组的length属性返回数组的长度即元素个数。这里nums有5个元素nums.length的值为5。循环条件i nums.length确保i从0遍历到4正好覆盖所有有效索引。第二个空nums[i]在循环体内i依次取 0、1、2、3、4nums[i]依次取出数组中的每个元素通过System.out.println打印输出。运行结果1 2 3 4 5三、编程题请编写一个Java程序完成以下功能创建一个长度为5的int数组。从键盘输入5个整数存入数组中。提示可以使用Scanner类找出数组中的最大值并打印出来。参考答案importjava.util.Scanner;publicclassFindMax{publicstaticvoidmain(String[]args){// 1. 创建一个长度为5的int数组int[]arrnewint[5];// 2. 从键盘输入5个整数存入数组中ScannerscannernewScanner(System.in);System.out.println(请输入5个整数);for(inti0;iarr.length;i){System.out.print(请输入第(i1)个数);arr[i]scanner.nextInt();}scanner.close();// 3. 找出数组中的最大值intmaxarr[0];// 假设第一个元素为最大值for(inti1;iarr.length;i){if(arr[i]max){maxarr[i];// 更新最大值}}// 打印最大值System.out.println(数组中的最大值为max);}}运行示例请输入5个整数 请输入第1个数23 请输入第2个数56 请输入第3个数12 请输入第4个数89 请输入第5个数45 数组中的最大值为89解析创建数组int[] arr new int[5];创建了一个长度为5的int类型数组所有元素默认初始化为0。输入数据使用Scanner类从键盘读取输入。Scanner scanner new Scanner(System.in);创建扫描器对象。通过for循环遍历数组每次调用scanner.nextInt()读取一个整数并存入数组对应位置。使用System.out.print提示用户当前输入的是第几个数提升交互体验。输入完成后调用scanner.close()关闭扫描器释放资源。查找最大值采用「打擂台」算法先假设第一个元素arr[0]是最大值赋值给变量max。从索引1开始遍历数组剩余元素如果发现某个元素比当前max更大就更新max为该元素的值。遍历结束后max中存储的就是整个数组的最大值。输出结果使用System.out.println将最大值打印到控制台。打印出来。