第三章 下 Java数组与函数:高效编程双利器
1 数组当程序中需要存储大量同类型的数据时需要使用“数组”。例如为了保存50个学生的语文考试成绩如果没有数组则需要定义50个变量才能保存50个学生的成绩这非常不方便而如果使用数组则只需要定义一个数组变量即可。1.1 定义数组在Java中定义数组需要两个步骤第一步定义数组变量的名称和数据类型第二步确定数组的元素个数。定义数组变量的名称和数据类型的一般形式是数据类型[] 数组变量名;这里仅仅完成了第一步也就是只定义了数组的数据类型和变量名并没有说明这个数组包含多少个元素。为了说明数组的元素个数需要使用Java的new关键字为数组创建存储空间。确定数组元素个数的一般形式是数组变量名 new 数据类型[元素个数];在使用new关键字创建数组时Java会自动将每个数组元素的值初始化为对应数据类型的默认值数值类型为0布尔类型为false引用类型为null。例如为了定义一个能够保存50个学生语文成绩的数组变量可以使用如下语句float[] scores;scores new float[50];在Java中也可以将定义数组的两个步骤合并为一个步骤如下所示数据类型[] 数组变量名 new 数据类型[元素个数];类似的为了定义一个能够保存50个学生语文成绩的数组变量可以使用如下语句float[] scores new float[50];还可以在定义数组时同时完成对数组元素的初始化数据类型[] 数组变量名 new 数据类型[] {初始值0, 初始值1, ..., 初始值k};或者使用简化形式数据类型[] 数组变量名 {初始值0, 初始值1, ..., 初始值k};采用这种方式定义并初始化数组时大括号里面的元素个数就是数组的元素个数。示例// 方式1先声明后分配空间 int[] numbers1; numbers1 new int[5]; // 方式2声明同时分配空间 int[] numbers2 new int[5]; // 方式3声明同时初始化 int[] numbers3 new int[] {1, 2, 3, 4, 5}; // 方式4简化初始化 int[] numbers4 {1, 2, 3, 4, 5}; // 字符串数组示例 String[] names {张三, 李四, 王五}; // 布尔数组示例 boolean[] flags new boolean[3]; // 默认值都是false1.2 访问数组元素一旦定义了数组并通过“new”关键字确定了数组的元素个数就可以使用“[下标]”运算符访问数组的元素其中“下标”是一个整数值假定数组的元素个数为N那么“下标”取值范围从0、1、2 ...到N-1。public static void main(String[] args) { float[] salary new float[12]; salary[0] 5000.15F; salary[1] 6060.6F; System.out.println(一月份的收入是 salary[0]); System.out.println(二月份的收入是 salary[1]); System.out.println(三月份的收入是 salary[2]); System.out.println(十二月份的收入是 salary[11]); }1.3 使用for each遍历数组元素使用数组类似于定义了多个同名同类型的变量数组的这一特性非常适合用于对数组的遍历访问数组中的每一个元素。当然为了遍历数组中的元素可以使用前面介绍的for循环或者while循环。public static void main(String[] args) { float[] salary {5000.0F, 1234.5F, 6090.5F, 8000F, 6781.5F, 6712.8F, 2312.4F, 3456.7F, 10000.5F, 2111.8F, 4070F, 8760.5F}; float total 0; for(int i0; i12; i) { total salary[i]; } System.out.println(全年的收入是 total); }While循环可以完成相同的任务在Java中为了遍历数组元素还可以使用一种更为简单的方式使用for each循环如下面的例子所示public static void main(String[] args) { float[] salary {5000.0F, 1234.5F, 6090.5F, 8000F, 6781.5F, 6712.8F, 2312.4F, 3456.7F, 10000.5F, 2111.8F, 4070F, 8760.5F}; float total 0; for(float m : salary) total m; System.out.println(全年的收入是 total); }for each的一般形式如下1.4 二维数组在Java中可以定义一维数组当然也可以定义二维数组甚至更高维的数组。二维数组非常类似日常生活中的表格包括数据行和数据列。二维数组的定义二维数组可以看作是一维数组的数组即数组的每个元素又是一个一维数组。定义二维数组的语法如下// 方式1先声明后分配空间 int[][] matrix1; matrix1 new int[3][4]; // 3行4列的二维数组 // 方式2声明同时分配空间 int[][] matrix2 new int[3][4]; // 方式3声明同时初始化 int[][] matrix3 new int[][] { {1, 2, 3}, {4, 5, 6}, {7, 8, 9} }; // 方式4简化初始化 int[][] matrix4 { {1, 2, 3}, {4, 5, 6}, {7, 8, 9} }; // 不规则二维数组每行长度不同 int[][] irregular new int[3][]; irregular[0] new int[2]; // 第0行有2个元素 irregular[1] new int[3]; // 第1行有3个元素 irregular[2] new int[4]; // 第2行有4个元素访问二维数组元素访问二维数组元素需要使用两个下标第一个下标表示行索引第二个下标表示列索引。索引从0开始。public class TwoDArrayExample { public static void main(String[] args) { // 定义一个3x3的二维数组 int[][] matrix { {1, 2, 3}, {4, 5, 6}, {7, 8, 9} }; // 访问特定元素 System.out.println(matrix[0][0] matrix[0][0]); // 输出: 1 System.out.println(matrix[1][2] matrix[1][2]); // 输出: 6 // 修改元素值 matrix[2][1] 88; System.out.println(修改后 matrix[2][1] matrix[2][1]); // 输出: 88 // 遍历二维数组 System.out.println(二维数组所有元素); for (int i 0; i amp;lt; matrix.length; i) { for (int j 0; j amp;lt; matrix[i].length; j) { System.out.print(matrix[i][j] ); } System.out.println(); } // 使用for-each遍历 System.out.println(使用for-each遍历); for (int[] row : matrix) { for (int value : row) { System.out.print(value ); } System.out.println(); } } }二维数组的应用场景表格数据存储如学生成绩表行学生列科目矩阵运算如矩阵加法、乘法等数学运算游戏棋盘如棋盘游戏、扫雷等图像处理像素点可以表示为二维数组示例学生成绩表public class StudentGrades { public static void main(String[] args) { // 3个学生4门科目 double[][] grades { {85.5, 90.0, 78.5, 92.0}, // 学生1的成绩 {76.0, 88.5, 91.0, 79.5}, // 学生2的成绩 {92.5, 87.0, 84.5, 95.0} // 学生3的成绩 }; // 计算每个学生的平均分 System.out.println(学生平均分); for (int i 0; i lt; grades.length; i) { double sum 0; for (int j 0; j lt; grades[i].length; j) { sum grades[i][j]; } double average sum / grades[i].length; System.out.printf(学生%d的平均分: %.2f%n, i 1, average); } // 计算每门科目的平均分 System.out.println(\n科目平均分); for (int j 0; j amp;lt; grades[0].length; j) { double sum 0; for (int i 0; i amp;lt; grades.length; i) { sum grades[i][j]; } double average sum / grades.length; System.out.printf(科目%d的平均分: %.2f%n, j 1, average); } } }2 函数及其调用当程序功能复杂且代码量比较大时可以根据业务功能将程序拆分为多个功能部件称这些功能部件为函数也称为方法。一个Java类可以包含多个函数。函数是规模化程序设计的有力手段可以提高代码的可读性、可维护性和复用性。函数的定义函数定义的基本语法[访问修饰符] 返回类型 函数名(参数列表) { // 函数体 [return 返回值;] }示例判断质数的函数import java.util.Scanner; public class PrimeNumberChecker { /** * 判断一个数是否为质数 * param number 要判断的整数 * return 如果是质数返回true否则返回false */ public static boolean isPrime(int number) { if (number 1) { return false; } // 优化只需要检查到sqrt(number) for (int i 2; i * i number; i) { if (number % i 0) { return false; } } return true; } /** 主函数从键盘接收用户输入判断是否为质数 */ public static void main(String[] args) { Scanner scanner new Scanner(System.in); int input; System.out.println(质数判断程序输入0结束); while (true) { System.out.print(请输入一个整数); input scanner.nextInt(); if (input 0) { System.out.println(程序结束。); break; } if (isPrime(input)) { System.out.println(input 是质数。); } else { System.out.println(input 不是质数。); } } scanner.close(); } }函数调用的优势代码复用相同的功能只需编写一次多处调用模块化将复杂问题分解为小问题每个函数解决一个特定问题可维护性修改功能只需修改一处不影响其他代码可读性通过有意义的函数名代码更易理解更多函数示例public class MathFunctions { // 计算两个数的最大值 public static int max(int a, int b) { return a b ? a : b; } // 计算阶乘 public static long factorial(int n) { if (n 0) { throw new IllegalArgumentException(阶乘不能为负数); } long result 1; for (int i 2; i n; i) { result * i; } return result; } // 计算数组的平均值 public static double average(double[] numbers) { if (numbers null || numbers.length 0) { return 0; } double sum 0; for (double num : numbers) { sum num; } return sum / numbers.length; } // 打印数组 public static void printArray(int[] array) { System.out.print([); for (int i 0; i array.length; i) { System.out.print(array[i]); if (i array.length - 1) { System.out.print(, ); } } System.out.println(]); } public static void main(String[] args) { // 调用max函数 System.out.println(5和8的最大值是 max(5, 8)); // 调用factorial函数 System.out.println(5的阶乘是 factorial(5)); // 调用average函数 double[] scores {85.5, 90.0, 78.5, 92.0}; System.out.println(平均分是 average(scores)); // 调用printArray函数 int[] numbers {1, 2, 3, 4, 5}; printArray(numbers); } }函数参数传递值传递基本数据类型int, double, boolean等传递的是值的副本引用传递数组和对象传递的是引用的副本可以修改原对象内容public class ParameterPassing { // 基本数据类型 - 值传递 public static void modifyValue(int x) { x 100; // 修改的是副本不影响原值 } // 数组 - 引用传递 public static void modifyArray(int[] arr) { if (arr.length gt; 0) { arr[0] 999; // 修改会影响原数组 } } public static void main(String[] args) { int num 10; System.out.println(修改前num num); // 输出: 10 modifyValue(num); System.out.println(修改后num num); // 输出: 10未改变 int[] numbers {1, 2, 3}; System.out.println(修改前numbers[0] numbers[0]); // 输出: 1 modifyArray(numbers); System.out.println(修改后numbers[0] numbers[0]); // 输出: 999已改变 } }3 案例学生成绩计算系统全班有20个学生近期进行了数学课阶段考试需要编写一个Java程序对成绩进行统计。编写一个程序首先输入全班的考试成绩然后计算并输出学生成绩的最高分、最低分和平均分。要输入和保存20个学生的数学成绩最好的方式就是定义一个float类型的数组变量并指定数组的元素个数为20当然也需要定义保存最高成绩、最低成绩和平均成绩的变量。之后使用for循环或者while循环提示输入成绩在输入成绩的同时计算成绩的最高分、最低分和平均分。package org.example; import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner sc new Scanner(System.in); float[] scores new float[20]; float max -10.F, min 200.0F, avg 0.0F; for(int i0; i20; i) { System.out.println(请输入第 i 个学生的成绩); scores[i] sc.nextFloat(); if (max scores[i]) max scores[i]; if (min scores[i]) min scores[i]; avg avg scores[i]; } avg avg / 20; System.out.println(最高分 max); System.out.println(最低分 min); System.out.println(平均分 avg); } }4 全文总结本文系统介绍了Java中数组和函数的核心概念与应用。首先详细讲解了数组的定义、访问、遍历包括for-each循环以及二维数组的使用通过多个代码示例展示了数组在实际编程中的应用。接着深入探讨了函数的定义、调用、参数传递机制及其在代码复用、模块化、可维护性和可读性方面的优势。最后通过学生成绩计算系统案例将数组与函数知识结合演示了如何解决实际问题。文章内容由浅入深理论与实践结合为Java初学者提供了全面的学习指导。

相关新闻

嵌入式第三天

嵌入式第三天

今日学习内容:C语言变量规范、表达式与类型转换、全套运算符、优先级规则,以及字符IO、scanf/printf格式化输入输出,同时弄懂了左值右值、内存赋值规则,并且可以用getchar/putchar完成字符处理的实操。 一、变量的定义、命名与初始…

2026/10/11 16:07:17 阅读更多 →
本人亲测,森优时铁锌维,可以治疗白发

本人亲测,森优时铁锌维,可以治疗白发

首先明确一点,营养素补充剂不能替代药物治疗白发问题,本人亲测,森优时铁锌维,可以对成年人群营养不均衡、压力熬夜导致的白发增多提供有效的营养支持,对改善发根灰白有一定的辅助作用,并非药物治疗。一、本…

2026/10/13 4:44:15 阅读更多 →
为什么 AREA 要指定 CODE 或 DATA 属性?

为什么 AREA 要指定 CODE 或 DATA 属性?

难度:★ 本文首发于我的嵌入式技术公众号「OneChan」,未经授权禁止转载。 打开任何一个 Keil 启动文件,你都会看到这样的代码: AREA STACK, NOINIT, READWRITE, ALIGN=3 Stack_Mem SPACE 0x400 __initial_spAREA RESET, DATA, READONLY __Vectors DCD …

2026/10/2 13:11:45 阅读更多 →

最新新闻

C#调用WebService获取PDF转图片:选型与踩坑实战

C#调用WebService获取PDF转图片:选型与踩坑实战

做C#开发这几年,遇到“调用WebService获取PDF文件再转换为图片”这种需求不算少。可能是一个审批系统需要预览合同,也可能是一个报表平台需要把服务端生成的文件转成缩略图展示。总之核心工作就两件事:把远程文件拿下来,再在本地转…

2026/10/14 6:40:29 阅读更多 →
Unity Spark实战:在浏览器中用AI自然语言快速做游戏原型

Unity Spark实战:在浏览器中用AI自然语言快速做游戏原型

看到“Unity Spark 正式发布”这条消息的时候,我第一反应是:又来了。这年头但凡和 AI 沾边的工具都在喊“原生支持 AI”,口号早就被用烂了。但等我真正在浏览器里打开这个基于 AI 的游戏开发环境,亲手生成一个场景、跑通一次跳跃、…

2026/10/14 6:40:29 阅读更多 →
仓颉语言属性(prop)完全指南:getter/setter 定义、抽象属性与继承覆盖实战

仓颉语言属性(prop)完全指南:getter/setter 定义、抽象属性与继承覆盖实战

文档编程语言 【免费下载链接】cangjie_docs 仓颉编程语言开发者文档。 项目地址: https://gitcode.com/Cangjie/cangjie_docs 点击查看 免费下载 属性(Properties)是仓颉语言中用于间接获取和设置值的语言机制:它通过一个 gette…

2026/10/14 6:40:29 阅读更多 →
从Node到Bun:JavaScript运行时与工具链的工程效率革命

从Node到Bun:JavaScript运行时与工具链的工程效率革命

1. 为什么我把重心从 Node 切到了 Bun先说结论:Bun 不是又一个跑得更快的 Node,它是一整套重新设计过的 JavaScript 运行时和工具链。我最初对它的态度是观望,因为这类"下一代运行时"的宣发见过太多次了,但真正在几个中…

2026/10/14 6:40:29 阅读更多 →
C#对接WebService拉取PDF并转图片:从接口调到部署避坑

C#对接WebService拉取PDF并转图片:从接口调到部署避坑

前一阵接手一个对接任务,对方是个运行了十多年的老系统,只对外暴露SOAP风格的WebService接口。业务要求很直接:通过这个接口把PDF文件拉到我们这边,再转成图片,放到Web端做在线预览和打印存档。这类需求在C#开发里非常…

2026/10/14 6:40:29 阅读更多 →
纯Python实现猜数字游戏:从零到避坑的完整指南

纯Python实现猜数字游戏:从零到避坑的完整指南

猜数字游戏大概是很多人的第一个编程项目。它不像计算器那样枯燥,也不需要复杂的界面,但一套完整流程走下来,变量、输入输出、条件判断、循环、异常处理这些编程入门核心概念全部能练到。我最近又把这个小项目从头写了一遍,用最基…

2026/10/14 6:39:29 阅读更多 →

日新闻

AnyPS5通用适配层设计:兼容性与性能的工程取舍

AnyPS5通用适配层设计:兼容性与性能的工程取舍

1. 从"AnyPS5"这个名字说起:它到底想解决什么问题第一次看到"AnyPS5"这个标题,我脑子里冒出来的第一个念头是:这大概率是一个围绕"跨平台运行"或者"通用适配"做文章的项目。名字里的"Any"…

2026/10/14 0:00:41 阅读更多 →
Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

1. 项目概述:Flutter跨平台二手交易应用开发作为一名长期从事移动应用开发的工程师,我最近完成了一个基于Flutter框架的二手物品交易平台项目。这个项目最吸引我的地方在于它完美结合了Flutter的跨平台优势与HarmonyOS的生态特性,实现了"…

2026/10/14 0:00:41 阅读更多 →
DFS算法解决飞机降落调度问题实战

DFS算法解决飞机降落调度问题实战

1. 项目背景与核心思路飞机降落问题是一个经典的调度优化场景,也是算法竞赛和面试中的高频题目。这个题目要求我们合理安排多架飞机的降落顺序和时间,确保所有飞机都能安全着陆而不发生冲突。在实际航空管制中,这类问题直接关系到飞行安全和机…

2026/10/14 0:00:41 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/14 3:30:28 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/13 16:22:04 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/14 3:29:58 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 22:01:27 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 14:57:39 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 18:11:17 阅读更多 →