🔥「炎码工坊」技术弹药已装填!
点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】
一、为什么需要数组?
场景问题:假设你要开发一个学生成绩管理系统,需要存储一个班级的50名学生的数学成绩,并计算平均分。如果不用数组,你可能会这样写代码:
int score1 = 85;
int score2 = 92;
// ... 一直到 score50
这显然效率低下且难以维护。数组的出现正是为了解决这类问题——它能用一个变量存储多个相同类型的数据,并通过索引快速访问。
二、什么是数组?
数组是一种连续存储的线性数据结构,具有以下特点:
- 固定长度:创建后不可改变大小
- 同质性:所有元素必须是相同类型(如
int[]
或String[]
) - 索引访问:通过从
0
开始的索引快速定位元素
三、数组的声明与初始化
方案对比:静态 vs 动态初始化
1. 静态初始化(直接赋值)
int[] scores = {85, 92, 78, 90, 88};
优点:简洁直观,适合已知具体值的场景
缺点:灵活性差,无法动态扩展
2. 动态初始化(指定长度)
int[] scores = new int[5];
scores[0] = 85;
scores[1] = 92;
// 其余元素默认初始化为 0
优点:运行时动态分配空间,适合未知具体值的场景
缺点:需要手动赋值,初始值可能不符合需求
3. 混合初始化
int[] scores = new int[]{85, 92, 78, 90, 88};
适用场景:需要同时声明和赋值,但长度可能由后续逻辑决定
四、数组的核心操作
1. 遍历数组
传统 for 循环
for (int i = 0; i < scores.length; i++) { System.out.println("第 " + (i + 1) + " 个成绩:" + scores[i]);
}
增强 for 循环(推荐)
for (int score : scores) { System.out.println("成绩:" + score);
}
2. 数组排序
import java.util.Arrays; Arrays.sort(scores); // 升序排序
System.out.println("排序后:" + Arrays.toString(scores));
3. 查找元素
int index = Arrays.binarySearch(scores, 90); // 二分查找(需先排序)
System.out.println("90 的索引:" + index);
4. 数组复制
int[] copy = Arrays.copyOf(scores, scores.length);
五、多维数组
场景:存储一个班级多个学科的成绩(如数学、语文、英语)
int[][] classScores = { {85, 92, 78}, // 学生1的数学、语文、英语成绩 {90, 88, 84}, // 学生2 {75, 80, 82} // 学生3
}; System.out.println("学生2的英语成绩:" + classScores[1][2]);
六、数组的局限性与替代方案
1. 局限性
- 固定长度:无法动态扩容(需手动创建新数组)
- 插入删除效率低:需要移动元素
2. 替代方案
- ArrayList:动态扩容的集合类(底层基于数组实现)
import java.util.ArrayList; ArrayList<Integer> dynamicList = new ArrayList<>();
dynamicList.add(85);
dynamicList.add(92);
七、内存结构图解
八、总结
方案 | 适用场景 | 优点 | 缺点 |
静态初始化 | 已知固定值 | 简洁 | 不灵活 |
动态初始化 | 运行时动态填充数据 | 灵活 | 初始值可能无效 |
多维数组 | 矩阵、表格类数据 | 结构清晰 | 操作复杂度高 |
ArrayList | 需要频繁扩容的场景 | 自动扩容、易操作 | 稍微牺牲性能 |
选择建议:
- 数据量固定且简单:优先使用数组
- 需要动态扩容或复杂操作:使用
ArrayList
代码练习:尝试实现一个程序,输入5个学生的数学成绩,输出最高分、平均分及排序后的成绩列表。
通过这篇文章,你应该能掌握数组的核心用法和选择策略。
🚧 您已阅读完全文99%!缺少1%的关键操作:
加入「炎码燃料仓」
🚀 获得:
√ 开源工具红黑榜 √ 项目落地避坑指南
√ 每周BUG修复进度+1%彩蛋
(温馨提示:本工坊不打灰工,只烧脑洞🔥)