下面是一份系统化、从基础到进阶的 Java 数组详解(从入门到精通),帮你一次性建立完整认知 👇
一、什么是数组?
👉 数组(Array)是一种用于存储同一类型多个数据的容器。
int[] arr = {1, 2, 3, 4};
特点:
- 类型相同
- 长度固定
- 内存连续(重要!)
二、数组的定义与初始化
1️⃣ 静态初始化(推荐)
int[] arr = {1, 2, 3, 4};
2️⃣ 动态初始化
int[] arr = new int[5];
默认值:
- int → 0
- double → 0.0
- boolean → false
- 引用类型 → null
3️⃣ 完整写法
int[] arr = new int[]{1, 2, 3};
三、数组的基本操作
1️⃣ 访问元素
int x = arr[0];
2️⃣ 修改元素
arr[1] = 100;
3️⃣ 遍历数组
普通 for(最常用)
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
增强 for(foreach)
for (int x : arr) {
System.out.println(x);
}
⚠️ 注意:不能修改数组元素
四、数组内存原理(核心理解)
int[] arr = new int[3];
👉 内存结构:
- 栈:存储引用(arr)
- 堆:存储实际数组对象
👉 本质:
arr 是“指向数组的地址”
五、常见操作(必会)
1️⃣ 求最大值
int max = arr[0];
for (int i = 1; i < arr.length; i++) {
if (arr[i] > max) {
max = arr[i];
}
}
2️⃣ 求和
int sum = 0;
for (int x : arr) {
sum += x;
}
3️⃣ 查找元素
int target = 5;
for (int i = 0; i < arr.length; i++) {
if (arr[i] == target) {
System.out.println("找到索引:" + i);
}
}
六、数组常见异常(重点)
❌ 1. 越界异常
arr[10]; // ArrayIndexOutOfBoundsException
❌ 2. 空指针异常
int[] arr = null;
arr.length; // NullPointerException
七、多维数组(二维数组)
1️⃣ 定义
int[][] arr = new int[3][4];
👉 3行4列
2️⃣ 初始化
int[][] arr = {
{1, 2, 3},
{4, 5, 6}
};
3️⃣ 遍历
for (int i = 0; i < arr.length; i++) {
for (int j = 0; j < arr[i].length; j++) {
System.out.print(arr[i][j] + " ");
}
}
4️⃣ 不规则数组(锯齿数组)
int[][] arr = new int[3][];
arr[0] = new int[2];
arr[1] = new int[5];
arr[2] = new int[3];
八、数组 vs 集合(重要区别)
| 对比 | 数组 | 集合(ArrayList等) |
|---|---|---|
| 长度 | 固定 | 可变 |
| 类型 | 基本类型 + 对象 | 只能对象 |
| 性能 | 更快 | 略慢 |
| 功能 | 简单 | 丰富 |
九、常用工具类(进阶)
👉 Arrays 工具类(必须掌握)
import java.util.Arrays;
1️⃣ 排序
Arrays.sort(arr);
2️⃣ 转字符串
System.out.println(Arrays.toString(arr));
3️⃣ 查找(二分)
Arrays.binarySearch(arr, 5);
⚠️ 前提:必须已排序
4️⃣ 填充
Arrays.fill(arr, 0);
十、数组拷贝(高频考点)
1️⃣ 浅拷贝
int[] b = arr;
👉 指向同一内存!
2️⃣ 深拷贝
int[] b = Arrays.copyOf(arr, arr.length);
3️⃣ System.arraycopy(高效🔥)
System.arraycopy(arr, 0, b, 0, arr.length);
十一、排序算法(进阶)
1️⃣ 冒泡排序
for (int i = 0; i < arr.length - 1; i++) {
for (int j = 0; j < arr.length - 1 - i; j++) {
if (arr[j] > arr[j + 1]) {
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
2️⃣ 选择排序(了解)
3️⃣ 快速排序(高阶)
👉 Java 内置排序底层就是优化版快排
十二、进阶技巧(精通关键)
⭐ 1. 数组作为方法参数
public static void print(int[] arr)
👉 传递的是引用!
⭐ 2. 可变参数(本质是数组)
public static void sum(int... nums)
⭐ 3. 数组转集合
List<Integer> list = Arrays.asList(1, 2, 3);
十三、面试高频坑
❌ 1. length vs length()
arr.length // 数组
str.length() // 字符串
❌ 2. foreach 修改无效
for (int x : arr) {
x = 10; // ❌ 不影响原数组
}
❌ 3. Arrays.asList 限制
List<int[]> list = Arrays.asList(arr); // ⚠️ 陷阱
十四、性能与底层(进阶)
👉 数组优势:
- O(1) 随机访问
- 内存连续 → 缓存友好
- 最接近底层的数据结构
👉 缺点:
- 扩容困难
- 插入删除成本高(O(n))
总结一句话
👉 数组本质:
“一块连续内存,用索引高效访问数据”
如果你想继续进阶👇
我可以帮你:
✅ 手写「十大经典数组算法题」
✅ 讲清「滑动窗口 / 双指针 / 前缀和」
✅ 或带你做「LeetCode 高频数组题」