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 中最基础的数据结构,理解好索引、遍历和拷贝,后面的集合框架学起来会顺畅很多。继续加油!💪

更多推荐