Java 数组
Java 数组:从入门到踩坑,一篇搞定
学习日期:2026-06-02 难度:⭐⭐ 入门级
一、什么是数组?
数组就是一组相同类型数据的集合,在内存中连续存储。你可以把它想象成一排格子,每个格子有编号(索引),从 0 开始。
plaintext
9
1
2
3
索引: 0 1 2 3 4
值: [10] [20] [30] [40] [50]
核心特点:
- ✅ 类型固定——一个数组只能存一种类型
- ✅ 长度固定——创建后不能扩容/缩容
- ✅ 索引从 0 开始——最后一个元素索引是
length - 1
二、数组的创建
2.1 声明 + 分配空间
java
9
1
2
3
4
5
6
7
// 方式一:先声明,再分配空间
int[] nums;
nums = new int[5]; // 5个元素,默认值全为0
// 方式二:一步到位
int[] nums = new int[5];
2.2 声明 + 初始化
java
9
1
2
3
4
5
6
// 静态初始化:直接给出所有值
int[] nums = {10, 20, 30, 40, 50};
// 也可以写成(两种写法等价)
int[] nums = new int[]{10, 20, 30, 40, 50};
⚠️ 注意:
new int[5]{10,20}是错误的!不能同时指定长度和初始值。
3.3 默认值
只分配空间不赋值时,Java 会给默认值:
表格
| 类型 | 默认值 |
|---|---|
| int / short / long | 0 |
| float / double | 0.0 |
| boolean | false |
| char | '\u0000' |
| 引用类型(String等) | null |
java
9
1
2
3
String[] names = new String[3];
// names[0] → null, names[1] → null, names[2] → null
三、数组的基本操作
3.1 访问元素
java
9
1
2
3
4
int[] nums = {10, 20, 30, 40, 50};
System.out.println(nums[0]); // 10(第一个)
System.out.println(nums[4]); // 50(最后一个)
3.2 修改元素
java
9
1
2
3
nums[2] = 99;
// 数组变为:[10, 20, 99, 40, 50]
3.3 获取长度
java
9
1
2
System.out.println(nums.length); // 5(注意:length是属性,不是方法!)
3.4 遍历数组
方式一:经典 for 循环(需要索引时用)
java
9
1
2
3
4
for (int i = 0; i < nums.length; i++) {
System.out.println("索引" + i + ":" + nums[i]);
}
方式二:增强 for 循环(for-each) (只看值不看索引时用)
java
9
1
2
3
4
for (int n : nums) {
System.out.println(n);
}
四、常见异常:ArrayIndexOutOfBoundsException
数组越界——Java 新手踩得最多的坑:
java
9
1
2
3
4
int[] nums = {10, 20, 30};
System.out.println(nums[3]); // ❌ 运行时报错!
// 有效索引是 0、1、2,没有 3
💡 避免方法:永远用
< nums.length而不是<= nums.length - 1,前者更直观、不容易写错。
五、数组进阶操作
5.1 数组拷贝
浅拷贝——只复制引用,修改互相影响:
java
9
1
2
3
4
5
int[] a = {1, 2, 3};
int[] b = a; // b 和 a 指向同一块内存!
b[0] = 99;
System.out.println(a[0]); // 99 ← a 也变了!
深拷贝——创建新数组,互不影响:
java
99
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// 方法一:手动拷贝
int[] a = {1, 2, 3};
int[] b = new int[a.length];
for (int i = 0; i < a.length; i++) {
b[i] = a[i];
}
// 方法二:System.arraycopy(更高效)
int[] src = {1, 2, 3, 4, 5};
int[] dest = new int[3];
System.arraycopy(src, 1, dest, 0, 3);
// 从 src 索引1 开始,拷贝3个元素到 dest 从索引0 开始
// dest → [2, 3, 4]
// 方法三:Arrays.copyOf(最简洁)
int[] original = {1, 2, 3};
int[] copy = Arrays.copyOf(original, original.length);
5.2 数组排序
java
9
1
2
3
4
5
6
int[] nums = {5, 2, 8, 1, 9};
// 升序排序
Arrays.sort(nums);
// nums → [1, 2, 5, 8, 9]
⚠️
Arrays.sort()是原地排序,会直接修改原数组,不会返回新数组。
5.3 数组转字符串
java
9
1
2
3
4
int[] nums = {10, 20, 30};
System.out.println(Arrays.toString(nums));
// 输出:[10, 20, 30]
💡 直接
System.out.println(nums)只会打印内存地址,如[I@15db9742,用Arrays.toString()才能看到内容。
5.4 二分查找
前提:数组必须已排序!
java
9
1
2
3
4
5
6
7
int[] nums = {1, 3, 5, 7, 9};
int index = Arrays.binarySearch(nums, 5);
System.out.println(index); // 2(找到,返回索引)
int notFound = Arrays.binarySearch(nums, 4);
System.out.println(notFound); // -3(未找到,返回 -(插入点+1))
六、二维数组
二维数组本质是数组的数组——一个一维数组,每个元素又是一个一维数组。
6.1 创建与初始化
java
99
1
2
3
4
5
6
7
8
9
10
// 静态初始化
int[][] matrix = {
{1, 2, 3},
{4, 5, 6},
{7, 8, 9}
};
// 动态初始化
int[][] matrix = new int[3][4]; // 3行4列,默认全0
6.2 访问元素
java
9
1
2
3
matrix[0][1]; // 第1行第2列 → 2
matrix[2][2]; // 第3行第3列 → 9
6.3 遍历二维数组
java
99
1
2
3
4
5
6
7
8
9
10
11
for (int i = 0; i < matrix.length; i++) { // 遍历行
for (int j = 0; j < matrix[i].length; j++) { // 遍历列
System.out.printf("%-4d", matrix[i][j]);
}
System.out.println();
}
// 输出:
// 1 2 3
// 4 5 6
// 7 8 9
七、Arrays 工具类速查
java.util.Arrays 是操作数组的瑞士军刀:
表格
| 方法 | 作用 | 示例 |
|---|---|---|
toString() |
数组转字符串 | Arrays.toString(arr) |
sort() |
升序排序 | Arrays.sort(arr) |
binarySearch() |
二分查找 | Arrays.binarySearch(arr, key) |
copyOf() |
复制指定长度 | Arrays.copyOf(arr, 10) |
copyOfRange() |
复制指定范围 | Arrays.copyOfRange(arr, 1, 4) |
fill() |
填充相同值 | Arrays.fill(arr, 0) |
equals() |
比较内容是否相同 | Arrays.equals(a, b) |
八、实战练习
练习1:求数组最大值和最小值
java
99
1
2
3
4
5
6
7
8
9
10
11
int[] nums = {12, 45, 7, 89, 23, 56};
int max = nums[0], min = nums[0];
for (int i = 1; i < nums.length; i++) {
if (nums[i] > max) max = nums[i];
if (nums[i] < min) min = nums[i];
}
System.out.println("最大值:" + max); // 89
System.out.println("最小值:" + min); // 7
练习2:数组元素反转
java
9
1
2
3
4
5
6
7
8
9
int[] nums = {1, 2, 3, 4, 5};
for (int i = 0, j = nums.length - 1; i < j; i++, j--) {
int temp = nums[i];
nums[i] = nums[j];
nums[j] = temp;
}
// nums → [5, 4, 3, 2, 1]
练习3:冒泡排序(手写版)
java
99
1
2
3
4
5
6
7
8
9
10
11
12
13
int[] arr = {64, 34, 25, 12, 22, 11, 90};
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;
}
}
}
// arr → [11, 12, 22, 25, 34, 64, 90]
九、总结速查表
表格
| 概念 | 要点 |
|---|---|
| 创建方式 | new int[n] / {1,2,3} / new int[]{...} |
| 索引范围 | 0 ~ length-1 |
| 遍历方式 | for 循环(有索引)/ for-each(只要值) |
| 浅拷贝 vs 深拷贝 | = 赋值共享引用 / Arrays.copyOf 创建新数组 |
| 排序 | Arrays.sort() 原地升序 |
| 打印 | 别直接 println,用 Arrays.toString() |
| 二维数组 | 数组的数组,arr[i][j] 访问 |
数组是 Java 中最基础的数据结构,理解好索引、遍历和拷贝,后面的集合框架学起来会顺畅很多。继续加油!💪
更多推荐
所有评论(0)