Java数组详解
一、数组的概念与作用
1. 什么是数组?
数组是相同数据类型元素的有序集合,它在内存中占据一块连续的存储空间,通过索引(下标) 快速访问元素(索引从0
开始)。
- 特点:
- 元素类型必须一致(如
int
数组只能存整数,String
数组只能存字符串)。 - 长度固定(创建后不可修改,若需动态扩容需手动处理)。
- 元素类型必须一致(如
2. 为什么需要数组?
假设需要存储100个学生的成绩,若不用数组,需声明100个变量(score1, score2, ..., score100
),操作极其繁琐。
数组的核心作用是批量管理相同类型的数据,通过索引统一访问,大幅简化代码。
二、一维数组(重点)
1. 声明数组
声明数组有两种语法(推荐第一种,更清晰):
// 语法1:数据类型[] 数组名;
int[] scores; // 声明int类型数组,用于存储成绩
String[] names; // 声明String类型数组,用于存储姓名// 语法2:数据类型 数组名[];(不推荐,易混淆)
int ages[];
注意:声明时仅定义数组类型,未分配内存,不能直接使用。
2. 初始化数组(分配内存并赋值)
初始化分为静态初始化(已知元素值)和动态初始化(已知长度,值默认)。
(1)静态初始化
直接指定元素值,长度由元素数量自动确定:
// 完整语法
int[] scores = new int[]{90, 85, 95, 78}; // 长度为4
String[] names = new String[]{"张三", "李四", "王五"}; // 长度为3// 简化语法(仅声明时可用)
int[] scores = {90, 85, 95, 78};
String[] names = {"张三", "李四", "王五"};
(2)动态初始化
先指定长度,元素值为默认值(整数0
、浮点数0.0
、布尔值false
、引用类型null
):
// 语法:数组名 = new 数据类型[长度];
int[] nums = new int[5]; // 长度为5,默认值:[0, 0, 0, 0, 0]
String[] arr = new String[3]; // 默认值:[null, null, null]
注意:静态初始化与动态初始化不能混用(如int[] arr = new int[3]{1,2,3};
错误)。
3. 访问数组元素
通过索引(0
到长度-1
)访问,语法:数组名[索引]
。
int[] scores = {90, 85, 95, 78};
// 访问元素
System.out.println(scores[0]); // 输出90(第一个元素)
System.out.println(scores[2]); // 输出95(第三个元素)// 修改元素
scores[1] = 88; // 将第二个元素(索引1)改为88
System.out.println(scores[1]); // 输出88
风险:若索引超出范围(如访问scores[4]
,长度为4,最大索引3),会抛出ArrayIndexOutOfBoundsException
(数组索引越界异常),需严格避免。
4. 数组长度
通过数组名.length
获取长度(固定值,不可修改):
int[] scores = {90, 85, 95, 78};
System.out.println(scores.length); // 输出4(长度为4)
5. 遍历数组(访问所有元素)
遍历是数组最常用操作,有for循环和增强for循环(foreach) 两种方式。
(1)普通for循环(推荐,可操作索引)
int[] scores = {90, 85, 95, 78};
// 循环索引:从0到length-1
for (int i = 0; i < scores.length; i++) {System.out.println("第" + (i+1) + "个成绩:" + scores[i]);
}
(2)增强for循环(仅遍历元素,无索引)
int[] scores = {90, 85, 95, 78};
// 语法:for(元素类型 变量名 : 数组名)
for (int score : scores) { // 依次取出数组元素,赋值给scoreSystem.out.println("成绩:" + score);
}
三、二维数组(数组的数组)
二维数组可理解为“表格”(行+列),本质是一维数组的每个元素都是另一个一维数组。
1. 声明与初始化
(1)静态初始化(已知所有元素)
// 完整语法:每行元素用{}包裹,整体再用{}
int[][] matrix = new int[][]{{1, 2, 3}, // 第0行:3个元素{4, 5}, // 第1行:2个元素(二维数组行长度可不同){6} // 第2行:1个元素
};// 简化语法
int[][] matrix = {{1, 2, 3},{4, 5},{6}
};
(2)动态初始化(已知行数和列数)
// 语法:new 数据类型[行数][列数]
int[][] students = new int[3][2]; // 3行2列,默认值全为0
// 第0行:[0, 0],第1行:[0, 0],第2行:[0, 0]
注意:二维数组支持“不规则数组”(每行长度不同):
int[][] arr = new int[3][]; // 声明3行,但列数不确定
arr[0] = new int[2]; // 第0行2列
arr[1] = new int[4]; // 第1行4列
arr[2] = new int[1]; // 第2行1列
2. 访问与遍历二维数组
通过数组名[行索引][列索引]
访问元素,遍历需嵌套for循环。
int[][] matrix = {{1, 2, 3},{4, 5},{6}
};// 访问第1行第0列元素(值为4)
System.out.println(matrix[1][0]); // 输出4// 遍历二维数组(外层循环行,内层循环列)
for (int i = 0; i < matrix.length; i++) { // matrix.length:行数(3)// 内层循环:当前行的列数(matrix[i].length)for (int j = 0; j < matrix[i].length; j++) {System.out.print(matrix[i][j] + " ");}System.out.println(); // 每行结束换行
}
输出结果:
1 2 3
4 5
6
四、数组工具类java.util.Arrays
(必学)
Arrays
类提供了大量操作数组的静态方法,无需手动实现复杂逻辑。
1. 排序(Arrays.sort()
)
对数组元素升序排序(int
、String
等类型均支持):
import java.util.Arrays; // 必须导入public class Test {public static void main(String[] args) {int[] nums = {3, 1, 4, 2};Arrays.sort(nums); // 排序后:[1, 2, 3, 4]System.out.println(Arrays.toString(nums)); // 打印数组}
}
2. 数组转字符串(Arrays.toString()
)
直接打印数组名会显示内存地址(如[I@1b6d3586
),toString()
可格式化输出:
int[] scores = {90, 85, 95};
System.out.println(Arrays.toString(scores)); // 输出:[90, 85, 95]
3. 数组拷贝(Arrays.copyOf()
)
用于数组扩容或截取(原数组不变,返回新数组):
int[] original = {1, 2, 3};
// 拷贝原数组,新长度为5,超出部分补默认值(0)
int[] expanded = Arrays.copyOf(original, 5);
System.out.println(Arrays.toString(expanded)); // 输出:[1, 2, 3, 0, 0]// 截取原数组索引0~1(含头不含尾)
int[] sub = Arrays.copyOfRange(original, 0, 2);
System.out.println(Arrays.toString(sub)); // 输出:[1, 2]
4. 填充数组(Arrays.fill()
)
将数组所有元素设置为指定值:
int[] arr = new int[4];
Arrays.fill(arr, 6); // 所有元素设为6
System.out.println(Arrays.toString(arr)); // 输出:[6, 6, 6, 6]
五、数组常见问题
- 索引越界异常:访问
索引 >= 长度
或负数索引时抛出,需确保索引在0 ~ 长度-1
范围内。 - 空指针异常:数组未初始化(仅声明)时使用,如
int[] arr; System.out.println(arr[0]);
。 - 长度固定:数组长度一旦确定不可修改,若需动态增减元素,需手动拷贝到新数组(或使用
ArrayList
)。
总结
- 数组是相同类型元素的有序集合,通过索引快速访问,解决批量数据管理问题。
- 一维数组核心:声明→初始化(静态/动态)→遍历(for/foreach)。
- 二维数组是“数组的数组”,需嵌套循环遍历。
Arrays
工具类简化排序、拷贝等操作,是开发必备。
通过 练习 案例,可快速掌握数组用法。