编程小白li 发表于 2021-12-27 12:18:36

有关Array的问题

本帖最后由 编程小白li 于 2021-12-27 12:22 编辑

大佬大佬我想问一下这5个结果为什么不是一样的呀,我觉得方法changeArray外结果: 应该和剩下的结果都一样呀,因为方法changeArray内结果: 说明输入的int[]已经被改变了,而且方法changeArray2外结果: 和方法changeArray2内结果: 结果一样,且与输入的int[]不同,说明在一个方法内改变了的array可以影响到方法外面,那为什么changeArray方法不行呢?

package com.Sirui._01DayArrays;

import java.util.Arrays;

public class Test {
    public static void main(String[] args) {
      int[] num1 = new int[]{ 1,1,1,1 };

      System.out.println("num1本身: " + Arrays.toString(num1));
      changeArray(num1);
      //为什么这里的结果num1没有改变?
      System.out.println("方法changeArray外结果: " + Arrays.toString(num1));//
      changeArray2(num1);
      //为什么这里的结果num1发生了改变?
      System.out.println("方法changeArray2外结果: " + Arrays.toString(num1));//

      int[] num3 = new int[]{ 1,1,1,1 };
      int[] num2 = new int[]{ 0,0,0,0 };
      num3 = num2;
      //这里如果直接将num2的Value赋值给num3,结果会改变num3
      System.out.println("直接将num2的Value赋值给num3的结果: " + Arrays.toString(num1));//
    }
    static void changeArray(int[] nums) {
      int n = nums.length;
      int[] newArr = new int;
      nums = newArr;
      System.out.println("方法changeArray内结果: " + Arrays.toString(nums));//
    }
    static void changeArray2(int[] nums) {
      for (int i = 0; i < nums.length; i++) {
            nums = 0;
      }
      System.out.println("方法changeArray2内结果: " + Arrays.toString(nums));//
    }
}


/Library/Java/JavaVirtualMachines/jdk-17.jdk/Contents/Home/bin/java -javaagent:/Applications/IntelliJ IDEA CE.app/Contents/lib/idea_rt.jar=50603:/Applications/IntelliJ IDEA CE.app/Contents/bin -Dfile.encoding=UTF-8 -classpath /Users/lisirui/JavaProgrammingLearning/java128/pro128/out/production/JavaLeetCode com.Sirui._01DayArrays.Test
num1本身:
方法changeArray内结果:
方法changeArray外结果:
方法changeArray2内结果:
方法changeArray2外结果:
直接将num2的Value赋值给num3的结果:

Process finished with exit code 0

编程小白li 发表于 2021-12-27 14:22:53

{:10_269:}

小伤口 发表于 2021-12-27 20:17:31

本帖最后由 小伤口 于 2021-12-27 20:18 编辑

这就关系到深拷贝和浅拷贝的问题
你可以先看看下面这个小例子
package com.xiaoshangkou;

public class Test {
    public static void main(String[] args) {
      int[] nums={1,1,1,1,1};
      int [] nums2=nums;
      for (int i=0;i<nums2.length;i++)
      {
            nums2=2;
            System.out.println(nums);
      }

    }
}
最终结果是nums里面的值也被影响到也会全部变成2
因为像直接用=复制这类都属于浅拷贝它只是将指向数组的引用复制过去
但他们都指向的是同一个内存地址,即同一个数组所以changeArray2里的值直接影响到nums
但changeArray 里面
int[] newArr = new int;
是new出来的一个数组相当于是在堆内存中重新开辟的数组,是一个全新的数组也就是深拷贝所以不会影响到外面的nums
这是我的个人理解,欢迎继续提问{:5_102:}

编程小白li 发表于 2021-12-30 12:00:14

小伤口 发表于 2021-12-27 20:17
这就关系到深拷贝和浅拷贝的问题
你可以先看看下面这个小例子



谢谢!!
确实帮助到我理解!
页: [1]
查看完整版本: 有关Array的问题