第31篇:Java数组详解
📌 系列导航:《Java 100 天进阶之路》完整目录 |
⬅️ 上一篇:第30篇:Date类、Calendar类、date转calendar |
➡️ 下一篇:第32篇:Java常用工具类(Objects、Collections、Arrays深入)
一、核心知识点
- 数组的定义:固定长度、相同类型元素的连续内存块
- 数组的初始化:静态初始化、动态初始化
- 数组的遍历:普通 for、增强 for
- 内存结构:数组变量在栈,数组对象在堆
- 多维数组:数组的数组(可非矩形,即“交错数组”)
Arrays工具类常用方法:sort()、binarySearch()、fill()、equals()、toString()、copyOf()
二、通俗讲解(1分钟开心学)
1. 数组是什么?
数组是一个容器,可以存放多个相同类型的数据。它有两个重要特征:
- 长度固定:一旦创建,不能增加或减少。
- 类型统一:要么全是
int,要么全是String等。
生活类比:数组就像一个带编号的储物柜,柜子数量固定(长度),每个格子只能放同一种类型的东西(类型统一),你可以通过编号(索引)快速存取。
2. 数组的声明与初始化
- 静态初始化:创建时直接指定元素值。
int[] arr = {1,2,3}; - 动态初始化:先指定长度,后赋值。
int[] arr = new int[5];元素有默认值(int→0,boolean→false,引用类型→null)。
3. 数组的内存
数组变量(引用)存储在栈内存中,指向堆中的数组对象。数组对象在堆中是一片连续的内存空间,每个元素根据类型占用固定字节。
4. 多维数组——数组的数组
Java中没有真正的二维数组,二维数组实际上是“数组的数组”。每个内层数组可以长度不同(非矩形数组),称为交错数组。例如int[][] ragged = new int[2][];,ragged[0] = new int[2];,ragged[1] = new int[5];——第一行2个格子,第二行5个格子,内存布局灵活但访问稍慢。
生活类比:多维数组就像抽屉里的文件夹。外层数组是抽屉柜(每个抽屉是一个数组引用),每个抽屉里放着一个独立的文件夹(内层数组),文件夹的页数(长度)可以各不相同。
5. Arrays 工具类
Java 提供了 java.util.Arrays,包含大量操作数组的静态方法,比如排序、二分查找、填充、比较、转字符串等。
三、实操代码案例 + 场景说明
场景:存储班级学生成绩,计算总分、最高分、排序,并体验一维与二维数组。
import java.util.Arrays;
public class ArrayDemo {
public static void main(String[] args) {
// ========== 一维数组 ==========
// 1. 静态初始化
int[] scores = {85, 92, 78, 90, 88};
// 2. 动态初始化
int[] another = new int[10]; // 默认值0
// 3. 遍历求总分和最高分
int sum = 0;
int max = scores[0];
for (int i = 0; i < scores.length; i++) {
sum += scores[i];
if (scores[i] > max) max = scores[i];
}
System.out.println("总分:" + sum + ",平均分:" + (double)sum / scores.length);
System.out.println("最高分:" + max);
// 4. 增强 for 循环
System.out.print("成绩列表:");
for (int score : scores) {
System.out.print(score + " ");
}
System.out.println();
// 5. 排序
Arrays.sort(scores);
System.out.println("排序后:" + Arrays.toString(scores));
// 6. 二分查找(需先排序)
int index = Arrays.binarySearch(scores, 88);
System.out.println("88 的索引:" + index);
// 7. 数组拷贝
int[] copy = Arrays.copyOf(scores, scores.length + 2);
System.out.println("拷贝后长度:" + copy.length);
// ========== 二维数组(交错数组) ==========
// 方法一:规则矩阵
int[][] matrix = new int[2][3];
matrix[0][0] = 1;
matrix[0][1] = 2;
matrix[1][0] = 3;
// 方法二:动态指定内层长度(交错数组)
int[][] ragged = new int[2][];
ragged[0] = new int[2]; // 第一行2个元素
ragged[1] = new int[5]; // 第二行5个元素
// 打印二维数组各行的长度
for (int i = 0; i < ragged.length; i++) {
System.out.println("第" + i + "行长度:" + ragged[i].length);
}
// 静态初始化二维数组
int[][] static2D = {
{1, 2, 3},
{4, 5},
{6, 7, 8, 9}
};
System.out.println("\n二维数组遍历结果:");
for (int i = 0; i < static2D.length; i++) {
for (int j = 0; j < static2D[i].length; j++) {
System.out.print(static2D[i][j] + " ");
}
System.out.println();
}
}
}
四、避坑要点
| 错误/误区 | 后果 | 正确做法 |
|---|---|---|
数组越界访问 arr[arr.length] | ArrayIndexOutOfBoundsException | 索引范围 0 到 length-1 |
| 多维数组中内层数组未初始化 | NullPointerException | 先 new 内层数组再使用 |
int[] arr = {1,2,3}; int[] arr2 = arr; 以为复制了数组 | arr2 只是引用,改变 arr2 会影响 arr | 用 Arrays.copyOf() 或 System.arraycopy() |
Arrays.asList() 返回的 List 不能增删 | 调用 add/remove 抛 UnsupportedOperationException | 用 new ArrayList<>(Arrays.asList(arr)) |
混淆数组长度属性 length 和字符串方法 length() | 编译错误 | 数组用 .length,字符串用 .length() |
| 创建二维数组时仅声明外层而未初始化内层就存取 | NullPointerException | 先为每一行分配独立的一维数组 |
五、面试高频考点
Q1:数组和 ArrayList 的区别?
数组长度固定,可存储基本类型,效率高;ArrayList 长度可变,只能存储对象,提供了丰富 API(增删改查),但底层也是数组。
Q2:如何将数组转换为 List?
List<String> list = Arrays.asList(arr);返回的是固定大小的Arrays.ArrayList,不能增删。如需可变:new ArrayList<>(Arrays.asList(arr))。
Q3:数组在内存中如何存储?
数组变量(引用)在栈中,指向堆中的数组对象。数组对象包含长度信息,以及连续存储的元素(基本类型值或对象引用)。
Q4:二维数组在内存中是如何存储的?
Java 中没有真正的二维数组,二维数组本质是“数组的数组”——外层数组存储的是内层数组的引用地址,内层每个一维数组在堆内存中独立存储。这也意味着每一行的长度可以不同。
Q5:什么是交错数组?有什么优缺点?
交错数组指二维数组中每一行的长度可以不同。优点是内存灵活,适合非表格形式的数据;缺点是访问时需要两次寻址(先找行数组引用,再找元素),速度略慢于规则矩阵,且遍历时需额外注意。
六、练习题
- 编程:手写冒泡排序对 int 数组排序。
- 理解:创建二维数组
int[][] arr = new int[3][];然后分别给每行分配不同长度(如2、4、6),并填充数据(如用双层循环赋值)。 - 代码填空:给定两个已排序的数组,合并成一个新的有序数组(归并思想)。
📊 你的学习进度
- 当前:第31篇 / 共44篇 · 第四阶段:注解、反射、代理、日期(第26~31篇)
- ✅ 已完成:第1~30篇
- 📖 正在学:第31篇
- ⏳ 待学习:第32~44篇
👉 📚 完整目录 & 学习指南 | 🔥 订阅本专栏,不错过每一篇
💡 本专栏每篇都包含:避坑表 + 面试高频考点 + 练习题。每天30分钟,100天拿offer!
👉 下一篇文章预告
《第32篇:Java常用工具类(Objects、Collections、Arrays深入)》
内容简介:Objects 的 null 安全方法、Collections 的排序/反转/不可变集合、Arrays 的数组操作,以及 Comparable 与 Comparator 排序。
💡 学完这篇,你将掌握 Java 工具箱里的瑞士军刀,写出更简洁高效的代码。
📌 《Java 100 天进阶之路 | 从入门到上岗就业》 每天一篇,建议收藏 + 关注,一起100天拿offer!
👉 点击关注我,更新后第一时间收到推送!
📌 除了Java,我也在深挖智能物流实战(出版社WMS、托盘调度、机器学习落地)。如果你对技术在不同领域的实战感兴趣,欢迎点击我的头像,看看专栏《出版社物流WMS智能调度实战》。技术相通,思路可鉴。

1万+

被折叠的 条评论
为什么被折叠?



