为什么Java中两个数组操作方法一个无法修改原数组一个可生效?
Java数组操作方法行为差异原因解析
首先给出示例代码(注释已汉化):
public class Main{ // 该方法无法修改外部传入的原数组 public static void changeArr1 (int [] arr) { int [] tmp = {10, 20}; arr = tmp; } // 该方法可以交换数组指定下标的两个元素 public static void swap(int[] arr,int i,int j){ int temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; } }
核心差异根源:Java仅支持值传递
Java中所有参数传递给方法时,传递的都是值的副本:
- 基本类型参数传递的是实际数值的拷贝
- 引用类型(比如数组)参数传递的是堆内存中对象的存储地址的拷贝,也就是引用的副本
为什么changeArr1无法修改原数组
方法内部的形参arr是外部数组引用的副本,初始状态下它和外部原数组变量指向堆中的同一个数组对象。但方法中执行arr = tmp时,仅修改了这个局部副本的指向,让它指向了新创建的tmp数组,完全不会影响外部原变量的指向,也没有修改原数组的内容,因此外部看不到任何改动。
为什么swap可以修改原数组元素
swap方法全程没有修改形参arr本身的指向,而是通过这个引用直接修改它指向的堆中原数组的内部元素。由于形参和外部原数组变量指向的是同一个数组对象,因此修改结果对外部可见,交换操作生效。
内容的提问来源于stack exchange,提问作者Pompa
相关产品推荐
相关产品推荐

