int[] arr
或int arr[]
,传递的是数组引用,方法内修改直接影响原数组。基础语法
声明数组形参时需指定数据类型和方括号[]
:
// 一维数组形参 public static void processArray(int[] numbers) { // 方法体 } // 二维数组形参 public static void processMatrix(int[][] matrix) { // 方法体 }
调用方法时直接传入数组实例:
int[] arr = {1, 2, 3}; processArray(arr); // 传递数组引用 int[][] matrix = {{1, 2}, {3, 4}}; processMatrix(matrix);
传递机制与内存原理
-
按值传递引用:
-
Java传递数组时复制的是数组的引用(内存地址),而非数组本身。
-
方法内通过引用修改元素会直接影响原始数组:
public static void modifyArray(int[] arr) { arr[0] = 100; // 修改会影响原始数组 } // 调用后:原始数组arr[0]变为100
-
-
重新赋值不影响原始引用:
- 若在方法内对形参赋予新数组,原始引用不变:
public static void reassignArray(int[] arr) { arr = new int[]{10, 20}; // 新数组赋值,不影响原始引用 }
- 若在方法内对形参赋予新数组,原始引用不变:
多维数组作为形参
多维数组需明确每维长度(第一维可省略):
public static void printMatrix(int[][] matrix) { for (int[] row : matrix) { for (int num : row) { System.out.print(num + " "); } System.out.println(); } }
调用时直接传递不规则多维数组:
int[][] jaggedArray = {{1}, {2, 3}, {4, 5, 6}}; printMatrix(jaggedArray); // 支持不规则数组
可变参数(Varargs)与数组的关联
可变参数本质是数组形参的语法糖:
// 以下两种声明等价 public static void sum(int... nums) { /* nums视为int[] */ } public static void sum(int[] nums) { /* 显式数组 */ } // 调用方式相同 sum(1, 2, 3); // 可变参数传入值列表 sum(new int[]{1, 2, 3}); // 显式传递数组
注意:避免同时重载
类型[]
和类型...
的方法,编译器无法区分。
关键注意事项
-
空指针风险:
public static void handleArray(int[] arr) { if (arr == null) { // 必须做空指针检查 throw new IllegalArgumentException("数组不能为null"); } // 安全操作 }
-
数组长度处理:
- 通过
arr.length
获取长度,避免硬编码:for (int i = 0; i < arr.length; i++) { // 安全遍历 }
- 通过
-
返回修改后的数组:
方法可通过返回值返回新数组(不影响原始引用):public static int[] doubleValues(int[] arr) { int[] result = new int[arr.length]; for (int i = 0; i < arr.length; i++) { result[i] = arr[i] * 2; } return result; // 返回新数组 }
实际应用场景
- 批量数据处理:统计、过滤或转换数组元素(如求平均值)。
- 算法实现:排序(
Arrays.sort()
内部机制)、搜索等。 - 矩阵运算:多维数组处理数学矩阵。
- 灵活API设计:结合可变参数简化调用(如日志工具支持
log(String... messages)
)。
与集合类的对比
特性 | 数组 | 集合类(如ArrayList) |
---|---|---|
大小固定 | 是(创建后长度不可变) | 否(动态扩容) |
性能 | 内存连续,访问速度快 | 需额外对象开销,略慢 |
功能扩展 | 有限(无内置方法) | 丰富(包含add()、remove()等) |
适用场景 | 确定长度、高性能需求 | 动态数据、复杂操作 |
- 数组作为形参:传递引用副本,元素修改影响原始数组。
- 多维数组:支持不规则结构,需显式声明维度。
- 最佳实践:始终检查
null
、善用length
属性、优先选可变参数提升可读性。 - 替代方案:复杂场景考虑
List
或Set
等集合类,通过list.toArray()
转换。
引用说明:本文内容遵循Oracle官方Java教程《Passing Reference Data Type Arguments》规范,参考《Java核心技术卷I》(第11版)第3.8节数组章节,实践代码基于OpenJDK 17验证。
原创文章,发布者:酷盾叔,转转请注明出处:https://www.kd.cn/ask/13582.html