Java 数组详细教程

数组是Java中存储固定大小同类型元素的数据结构。下面我将详细介绍Java数组的各个方面。

一、数组基础

1. 数组声明

1
2
3
4
5
6
7
8
// 声明一个整型数组
int[] intArray;

// 声明一个字符串数组
String[] stringArray;

// 也可以使用C风格的声明方式(不推荐)
int intArray2[];

2. 数组初始化

1
2
3
4
5
6
7
8
9
10
11
12
13
// 静态初始化 - 直接指定元素
int[] numbers = {1, 2, 3, 4, 5};

// 动态初始化 - 指定长度后再赋值
int[] numbers2 = new int[5];
numbers2[0] = 10;
numbers2[1] = 20;
// ...

// 默认初始化 - 元素有默认值
double[] doubles = new double[3]; // 默认值为0.0
boolean[] flags = new boolean[2]; // 默认值为false
String[] names = new String[3]; // 默认值为null

3. 数组访问

1
2
3
4
5
6
7
8
9
10
11
12
int[] arr = {10, 20, 30, 40, 50};

// 访问元素(索引从0开始)
System.out.println(arr[0]); // 10
System.out.println(arr[4]); // 50

// 修改元素
arr[2] = 35;
System.out.println(arr[2]); // 35

// 获取数组长度
System.out.println(arr.length); // 5

二、数组遍历

1. 普通for循环

1
2
3
4
5
int[] numbers = {1, 2, 3, 4, 5};

for (int i = 0; i < numbers.length; i++) {
System.out.println("索引 " + i + ": " + numbers[i]);
}

2. 增强for循环(for-each)

1
2
3
for (int num : numbers) {
System.out.println(num);
}

3. 使用Arrays.toString()

1
2
System.out.println(Arrays.toString(numbers));
// 输出: [1, 2, 3, 4, 5]

三、多维数组

1. 二维数组声明和初始化

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// 静态初始化
int[][] matrix = {
{1, 2, 3},
{4, 5, 6},
{7, 8, 9}
};

// 动态初始化
int[][] matrix2 = new int[3][4]; // 3行4列

// 不规则数组
int[][] irregularArray = {
{1, 2},
{3, 4, 5},
{6}
};

2. 二维数组遍历

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// 普通for循环
for (int i = 0; i < matrix.length; i++) {
for (int j = 0; j < matrix[i].length; j++) {
System.out.print(matrix[i][j] + " ");
}
System.out.println();
}

// 增强for循环
for (int[] row : matrix) {
for (int num : row) {
System.out.print(num + " ");
}
System.out.println();
}

四、数组常用操作

1. 数组复制

1
2
3
4
5
6
7
8
9
10
11
int[] source = {1, 2, 3, 4, 5};

// 方法1: System.arraycopy()
int[] dest1 = new int[5];
System.arraycopy(source, 0, dest1, 0, source.length);

// 方法2: Arrays.copyOf()
int[] dest2 = Arrays.copyOf(source, source.length);

// 方法3: clone()
int[] dest3 = source.clone();

2. 数组排序

1
2
3
4
5
6
7
8
9
10
int[] numbers = {5, 3, 9, 1, 7};

// 升序排序
Arrays.sort(numbers);
System.out.println(Arrays.toString(numbers)); // [1, 3, 5, 7, 9]

// 降序排序(使用Comparator)
Integer[] nums = {5, 3, 9, 1, 7};
Arrays.sort(nums, Collections.reverseOrder());
System.out.println(Arrays.toString(nums)); // [9, 7, 5, 3, 1]

3. 数组搜索

1
2
3
4
5
int[] sortedArray = {1, 3, 5, 7, 9};

// 二分查找(数组必须已排序)
int index = Arrays.binarySearch(sortedArray, 5);
System.out.println(index); // 2

4. 数组比较

1
2
3
4
5
6
int[] arr1 = {1, 2, 3};
int[] arr2 = {1, 2, 3};
int[] arr3 = {1, 2, 4};

System.out.println(Arrays.equals(arr1, arr2)); // true
System.out.println(Arrays.equals(arr1, arr3)); // false

5. 数组填充

1
2
3
int[] arr = new int[5];
Arrays.fill(arr, 10); // 全部填充为10
System.out.println(Arrays.toString(arr)); // [10, 10, 10, 10, 10]

五、数组与集合转换

1. 数组转List

1
2
3
4
5
6
7
String[] names = {"Alice", "Bob", "Charlie"};

// 方法1: Arrays.asList()(返回的List大小固定)
List<String> nameList = Arrays.asList(names);

// 方法2: 使用ArrayList构造函数(可修改)
List<String> nameList2 = new ArrayList<>(Arrays.asList(names));

2. List转数组

1
2
3
4
5
6
7
8
9
10
List<String> list = new ArrayList<>();
list.add("Apple");
list.add("Banana");
list.add("Orange");

// 转换为Object数组
Object[] objArray = list.toArray();

// 转换为特定类型数组
String[] strArray = list.toArray(new String[0]);

六、数组常见问题

1. 数组索引越界

1
2
int[] arr = {1, 2, 3};
System.out.println(arr[3]); // ArrayIndexOutOfBoundsException

2. 空指针异常

1
2
int[] arr = null;
System.out.println(arr.length); // NullPointerException

3. 数组长度不可变

1
2
int[] arr = new int[5];
arr.length = 10; // 编译错误,数组长度不可变

七、实用技巧

1. 数组反转

1
2
3
4
5
6
7
8
9
int[] arr = {1, 2, 3, 4, 5};

for (int i = 0; i < arr.length / 2; i++) {
int temp = arr[i];
arr[i] = arr[arr.length - 1 - i];
arr[arr.length - 1 - i] = temp;
}

System.out.println(Arrays.toString(arr)); // [5, 4, 3, 2, 1]

2. 查找最大值/最小值

1
2
3
4
5
6
7
8
9
10
11
12
int[] numbers = {5, 3, 9, 1, 7};

int max = numbers[0];
int min = numbers[0];

for (int num : numbers) {
if (num > max) max = num;
if (num < min) min = num;
}

System.out.println("最大值: " + max); // 9
System.out.println("最小值: " + min); // 1

3. 数组去重

1
2
3
4
5
6
7
8
9
10
11
12
13
14
int[] arr = {1, 2, 2, 3, 4, 4, 5};

Set<Integer> set = new HashSet<>();
for (int num : arr) {
set.add(num);
}

int[] uniqueArr = new int[set.size()];
int index = 0;
for (int num : set) {
uniqueArr[index++] = num;
}

System.out.println(Arrays.toString(uniqueArr)); // [1, 2, 3, 4, 5]