数组的基础知识

数组是一种存储连续数据的结构,它由相同类型的元素组成。在Java中,数组的长度是固定的,一旦创建后,无法改变。每个元素都通过索引访问,索引从0开始。这个特性使得数组在很多编程任务中非常有用。

数组的声明和初始化

在Java中,声明和初始化数组可以分为两步,首先声明数组变量,然后使用new关键字为数组分配内存并初始化。

1
2
3
4
5
6
7
8
9
10
11
// 声明一个整数数组
int[] numbers;

// 初始化一个长度为5的整数数组
numbers = new int[5];

// 声明并初始化一个字符串数组
String[] names = new String[]{"Alice", "Bob", "Charlie"};

// 使用简化的语法初始化一个字符数组
char[] vowels = {'a', 'e', 'i', 'o', 'u'};

通过指定数组的大小和类型,我们可以声明一个数组,然后使用new关键字为其分配内存空间。

数组的访问和遍历

通过索引,我们可以访问数组中的元素。索引从0开始,最后一个元素的索引为数组长度减1。

1
2
3
int firstNumber = numbers[0]; // 访问数组的第一个元素

numbers[2] = 10; // 修改数组的第三个元素

除了直接访问数组元素,我们还可以使用循环结构(如for循环或foreach循环)来遍历数组中的所有元素。

1
2
3
4
5
6
7
8
for (int i = 0; i < numbers.length; i++) {
System.out.println(numbers[i]);
}

// 使用foreach循环
for (int number : numbers) {
System.out.println(number);
}

数组排序

1. 使用Arrays.sort方法

Arrays.sort方法是最常见的用于对数组排序的方法,它可以对数组中的元素进行升序排序。

1
2
int[] numbers = {5, 2, 9, 1, 7};
Arrays.sort(numbers);

上述代码会对numbers数组进行升序排序,排序后numbers数组变为[1, 2, 5, 7, 9]

2. 使用Arrays.parallelSort方法

如果处理大型数组,并且想要利用多核处理器的优势来加速排序,可以使用Arrays.parallelSort方法。它会在底层使用并行算法进行排序。

1
2
int[] numbers = {5, 2, 9, 1, 7};
Arrays.parallelSort(numbers);

Arrays.sort相似,这段代码会对numbers数组进行升序排序,但是会利用并行算法来提高排序效率。

查找数组中的最大值和最小值

在处理数组时,经常需要查找数组中的最大值和最小值。可以使用Arrays.stream方法将数组转化为流,然后通过流的maxmin方法来查找最大值和最小值。

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

int max = Arrays.stream(numbers).max().getAsInt(); // 查找数组中的最大值
int min = Arrays.stream(numbers).min().getAsInt(); // 查找数组中的最小值

System.out.println("Max: " + max); // 输出最大值,结果为9
System.out.println("Min: " + min); // 输出最小值,结果为1

数组拷贝

1. 使用循环手动拷贝数组

1
2
3
4
5
6
int[] sourceArray = {1, 2, 3, 4, 5};
int[] destinationArray = new int[sourceArray.length];

for (int i = 0; i < sourceArray.length; i++) {
destinationArray[i] = sourceArray[i];
}

在上面的例子中,我们使用了一个for循环来遍历原始数组,并将每个元素复制到目标数组中。

2. 使用Arrays.copyOf方法

Arrays.copyOf方法允许我们更简洁地复制数组内容,并且可以选择只复制数组的一部分。

1
2
int[] sourceArray = {1, 2, 3, 4, 5};
int[] destinationArray = Arrays.copyOf(sourceArray, sourceArray.length);

Arrays.copyOf方法可以接受一个源数组和一个新数组的长度作为参数,并返回一个新的数组,新数组的内容是源数组的内容的副本。

3. 使用System.arraycopy方法

System.arraycopy方法提供了一种高效的数组复制方式,可以在原始数组和目标数组之间进行区域复制。这种方法可以用于部分数组拷贝。

1
2
3
int[] sourceArray = {1, 2, 3, 4, 5};
int[] destinationArray = new int[sourceArray.length];
System.arraycopy(sourceArray, 0, destinationArray, 0, sourceArray.length);

在上面的例子中,System.arraycopy方法接受源数组、源数组的起始位置、目标数组、目标数组的起始位置以及要复制的元素数量作为参数,将源数组的指定区域复制到目标数组的指定位置。

4. 使用Arrays.copyOfRange方法

Arrays.copyOfRange方法允许我们复制源数组的指定范围到一个新数组中。

1
2
int[] sourceArray = {1, 2, 3, 4, 5};
int[] destinationArray = Arrays.copyOfRange(sourceArray, 0, sourceArray.length);

Arrays.copyOfRange方法接受源数组、起始索引和结束索引作为参数,并返回一个新的数组,其中包含了源数组指定范围的内容。