为什么仅传入两个元素的swap方法无法交换Java数组的对应元素?
public class Utility { public static final <T> void swap(T a, T b) { T temp = a; a = b; b= temp; } public static final <T> void swapArr(T[] arr, int a, int b) { T temp = arr[a]; arr[a] = arr[b]; arr[b] = temp; } }
问题解答
核心逻辑:Java 仅支持值传递,所有方法参数传递的都是值的副本
- 调用
Utility.swap(a[i], a[j])无法生效的原因
调用该方法时,会把数组中a[i]、a[j]两个位置的取值复制为临时副本,传给swap方法的两个形参:如果数组存的是基本类型,副本就是数值本身;如果存的是引用类型,副本就是对象的内存地址值。
方法内部交换的只是这两个局部副本的取值,完全不会修改原数组中存储的内容,方法执行结束后局部形参直接销毁,原数组没有任何变化。 - 调用
Utility.swapArr(arr, i, j)可以生效的原因
调用该方法时,复制的是原数组对象的内存地址值作为副本传给形参arr,此时形参arr和外部的原数组指向堆内存中完全相同的数组对象。
方法内部通过arr[a]、arr[b]修改的是该公共数组对象内部的元素存储值,修改结果会直接作用到原数组上,因此交换操作可以生效。
内容的提问来源于stack exchange,提问作者sxy
相关产品推荐
相关产品推荐

