LeetCode 第 189 题要求将数组 nums 中元素均向右移动 k 位
public class Solution {
public static void main(String[] args) {
int[] nums = { 1, 2, 3, 4, 5, 6, 7 };
new Solution().rotate(nums, 3);
}
public void rotate(int[] nums, int k) {
int[] ret = new int[nums.length];
for (int i = 0; i <= nums.length - 1; i++) {
ret[(i + k) % nums.length] = nums[i];
}
System.arraycopy(ret, 0, nums, 0, nums.length); // 正确
// nums = array; // 错误
}
}
我的疑问是为什么最后的步骤需要通过 System.arraycopy 复制数组元素,而不能直接写成 nums = array 呢?我直接将 nums 这个引用指向 array 的内存地址不可以吗?求解
------------------------------------------- 分割线 -------------------------------------------
看完《深入理解Java虚拟机》回来复盘这个问题,其实不用理解与区分值传递、引用传递的概念与二者在Java与C++的区别,理解Java虚拟机的运行时数据区即可,罗列几点对我自己理解这个问题的知识点:
Java只有值传递,main()方法中的 int[] nums = { 1, 2, 3, 4, 5, 6, 7 }; 可以看成有一个指针nums 指向了数组,当你将 nums 传参进rotate()方法时,复制了另一个指针(这个指针刚好也叫nums)指向了数组,当你直接将rotate()方法的 nums指向 ret 时,跟main()方法的nums指针没有任何关系,还是指向了原来的数组。
当然不行了。nums好比一个仓库,ret是另一个仓库,且是临时仓库,最终的目的是利用临时仓库实现nums仓库的货物调整,最终还是要放到nums仓库,你不能把货物就放到临时仓库,然后把临时仓库当长期仓库用啊。