在JAVA中,数组的值在没有操作的情况下发生了更改

在JAVA中,数组的值在没有操作的情况下发生了更改,java,arrays,Java,Arrays,请看代码, 我在屏幕上得到的信息是:1:[2,1] 2:[1,1] 为什么会发生这种情况?这两个System.out.println()之间没有对nums[1]执行任何操作,但nums[1]的值已更改 public class SortingAlgorithm { public static void main(String[] args) { int[] nums= {2,1}; int l=0, h=nums.length-1; int[] final_resul

请看代码, 我在屏幕上得到的信息是:1:[2,1] 2:[1,1] 为什么会发生这种情况?这两个System.out.println()之间没有对nums[1]执行任何操作,但nums[1]的值已更改

public class SortingAlgorithm {

 public static void main(String[] args) {
    int[] nums= {2,1};
    int l=0, h=nums.length-1;
    int[] final_result=mergeSort(nums,l,h);
}

 public static int[] mergeSort(int[] nums,int l, int h) {

    if(l<h) {
        int m=(l+h)/2;              
        nums=merge(nums,l,h,m);
    }
    return nums;
}

 public static int[] merge(int[] nums,int l, int h, int m) {
    int[] result=nums;      
    int k=m+1, idx=0;   
    while(l<=m && k<=h) {
        if(nums[l]<nums[k]) {
        result[idx]=nums[l];                
        l++;    
        }

        else{                                    
                    System.out.println("1:"+Arrays.toString(nums));
        result[idx]=nums[k];     
                    System.out.println("2:"+Arrays.toString(nums));
        k++;
        }
        idx++;
    }
    while(l<=m) {
        result[idx]=nums[l];
        l++;
        idx++;
    }
    while(k<=h) {
        result[idx]=nums[k];
        k++;
        idx++;
    }
    return result;
}
公共类排序算法{
公共静态void main(字符串[]args){
int[]nums={2,1};
int l=0,h=nums.length-1;
int[]最终结果=合并排序(nums,l,h);
}
公共静态int[]合并排序(int[]nums,int l,int h){
如果(l

不复制数组“nums”;它只表示“result”和“nums”是同一个数组

因此,对“result”的操作就是对“nums”的操作,这可能是问题的根源

一个解决办法是

  int[] result = Arrays.copyOf(nums, nums.length);
(您需要“导入java.util.array”)

或者,手动复制它:

  int[] result = new int[nums.length];
  for (int k=0; k<nums.length; k++)
      result[k] = nums[k];
int[]结果=新的int[nums.length];

对于(int k=0;k可能重复的,也许您应该学习使用调试器逐步进入您的代码…非常感谢。“a=b”实际分配数组的引用(通过引用传递?)。我相信instantiable类和接口与array相同,因为它们都是存储地址的引用变量。此外,我相信System.arraycopy()也可以工作。是的-数组变量是对底层数组的引用,因此赋值会复制引用。
  int[] result = new int[nums.length];
  for (int k=0; k<nums.length; k++)
      result[k] = nums[k];