JavaSE:初识数组
引言:为什么需要数组?
在编程中,我们常需存储同一类型的批量数据(如30天的销售额、100名学生的成绩)。若用独立变量(day1, day2, ... day30
),代码将臃肿且难以维护。数组(Array)通过单一变量名+索引高效管理同类数据,是Java核心数据结构之一。
一、一维数组:存储线性数据
1. 声明与初始化
数组在Java中是对象,需先声明再分配内存:
// 方法1:声明后初始化
int[] sales;
sales = new int[12]; // 12个月的销售额 // 方法2:声明时初始化
double[] temperatures = new double[365]; // 365天的温度 // 方法3:直接赋值初始化
String[] weekdays = {"Mon", "Tue", "Wed", "Thu", "Fri"};
2. 内存分配原理
数组元素在内存中连续存储,通过基地址+偏移量访问:
内存示例:
地址 | 1000 | 1004 | 1008 | 1012
元素 | sales[0] | sales[1] | sales[2] | ...
访问
sales[2]
= 基地址(1000) + 2×4字节(int大小) = 1008
3. 关键特性
- 长度固定:通过
length
属性获取(sales.length
返回12) - 索引从0开始:有效范围
[0, length-1]
- 支持匿名数组:
printArray(new int[]{1, 2, 3});
二、多维数组:管理矩阵数据
1. 二维数组声明
// 声明3名学生×4科目的成绩
int[][] marks = new int[3][4]; // 直接初始化
int[][] matrix = { {1, 2, 3}, {4, 5, 6}, {7, 8, 9}
};
2. 内存模型
二维数组本质是数组的数组:
marks[0] → [科目1分数, 科目2分数, ...]
marks[1] → [科目1分数, 科目2分数, ...]
3. 遍历与长度获取
for (int i = 0; i < marks.length; i++) { // 行数:marks.length for (int j = 0; j < marks[i].length; j++) { // 列数:marks[i].length System.out.print(marks[i][j] + "\t"); } System.out.println();
}
三、数组实战:排序算法
选择排序(Selection Sort)
核心思想:每轮从未排序部分选最小值,交换到已排序末尾。
伪代码:
for i from 0 to array.length-1: minIndex = i for j from i+1 to array.length-1: if array[j] < array[minIndex]: minIndex = j swap array[i] and array[minIndex]
排序过程图解:
四、高级特性
存储任意类型
Object[] mixedData = {"Text", 42, 3.14}; // 支持对象和基本类型
匿名数组应用
calculateSum(new int[]{10, 20, 30}); // 无需单独声明
长度不可变
数组一旦创建,大小固定。需调整大小时,需新建数组并复制数据:
int[] newArray = Arrays.copyOf(original, newSize);
五、常见误区与最佳实践
越界访问
`arr[arr.length]` 会抛出`ArrayIndexOutOfBoundsException`
空指针风险
int[] arr = null;
System.out.println(arr[0]); // NullPointerException
遍历推荐
使用增强for循环简化代码:
for (int score : scores) { total += score;
}
结语
数组作为Java数据结构的基石,高效处理批量数据。掌握其内存模型、多维结构和排序算法,能显著提升代码质量。后续可结合ArrayList
等集合框架,灵活应对动态数据需求。。