掌握数组复制、排序和搜索的高级操作技巧
在Java编程中,数组是最基础也是最重要的数据结构之一。掌握数组的高级操作技巧,包括复制、排序和搜索,对于编写高效的程序至关重要。本章将深入探讨这些操作的实现方法和最佳实践。
// 使用Arrays.copyOf()
int[] copy = Arrays.copyOf(original, original.length);
// 使用System.arraycopy()
System.arraycopy(src, 0, dest, 0, length);
// 内置排序
Arrays.sort(array);
// 冒泡排序
for (int i = 0; i < n-1; i++) {
for (int j = 0; j < n-i-1; j++) {
if (array[j] > array[j+1]) {
// 交换元素
}
}
}
// 线性搜索
for (int i = 0; i < array.length; i++) {
if (array[i] == target) return i;
}
// 二分搜索
int index = Arrays.binarySearch(sortedArray, target);
不同的数组操作方法在性能上存在显著差异,选择合适的算法对程序性能至关重要。
方法 | 语法 | 性能 | 适用场景 |
---|---|---|---|
for循环 | for(int i=0; i<len; i++) |
较慢 | 学习和简单场景 |
System.arraycopy() | System.arraycopy(src,0,dest,0,len) |
最快 | 大数组复制 |
Arrays.copyOf() | Arrays.copyOf(array, length) |
快 | 常规复制需求 |
clone() | array.clone() |
快 | 完整复制 |
算法 | 时间复杂度 | 空间复杂度 | 稳定性 | 适用场景 |
---|---|---|---|---|
冒泡排序 | O(n²) | O(1) | 稳定 | 小数组,教学 |
选择排序 | O(n²) | O(1) | 不稳定 | 小数组 |
快速排序 | O(n log n) | O(log n) | 不稳定 | 大数组,一般情况 |
Arrays.sort() | O(n log n) | O(log n) | 稳定 | 生产环境推荐 |
算法 | 时间复杂度 | 前提条件 | 适用场景 |
---|---|---|---|
线性搜索 | O(n) | 无 | 未排序数组 |
二分搜索 | O(log n) | 数组已排序 | 已排序数组 |
Arrays.binarySearch() | O(log n) | 数组已排序 | 生产环境推荐 |
public class ArrayCopyExample {
public static void main(String[] args) {
System.out.println("=== Java数组复制操作示例 ===");
int[] originalArray = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
System.out.println("原始数组:");
printArray(originalArray);
System.out.println("\n1. 使用for循环复制:");
int[] copyByLoop = copyArrayByLoop(originalArray);
printArray(copyByLoop);
System.out.println("\n2. 使用System.arraycopy()复制:");
int[] copyBySystem = copyArrayBySystem(originalArray);
printArray(copyBySystem);
System.out.println("\n3. 使用Arrays.copyOf()复制:");
int[] copyByArrays = java.util.Arrays.copyOf(originalArray, originalArray.length);
printArray(copyByArrays);
System.out.println("\n4. 使用clone()方法复制:");
int[] copyByClone = originalArray.clone();
printArray(copyByClone);
}
public static int[] copyArrayByLoop(int[] source) {
int[] copy = new int[source.length];
for (int i = 0; i < source.length; i++) {
copy[i] = source[i];
}
return copy;
}
public static int[] copyArrayBySystem(int[] source) {
int[] copy = new int[source.length];
System.arraycopy(source, 0, copy, 0, source.length);
return copy;
}
public static void printArray(int[] array) {
System.out.print("[");
for (int i = 0; i < array.length; i++) {
System.out.print(array[i]);
if (i < array.length - 1) {
System.out.print(", ");
}
}
System.out.println("]");
}
}
// 推荐:使用System.arraycopy()处理大数组
System.arraycopy(src, 0, dest, 0, length);
// 推荐:使用Arrays.copyOf()处理常规需求
int[] copy = Arrays.copyOf(original, newLength);
// 推荐:生产环境使用内置排序
Arrays.sort(array);
// 推荐:已排序数组使用二分搜索
int index = Arrays.binarySearch(sortedArray, target);
// 避免:大数组使用for循环复制
for (int i = 0; i < largeArray.length; i++) {
copy[i] = largeArray[i];
}
// 避免:大数组使用O(n²)排序算法
// 冒泡排序、选择排序等
// 避免:已排序数组使用线性搜索
for (int i = 0; i < sortedArray.length; i++) {
if (sortedArray[i] == target) return i;
}