鱼C论坛

 找回密码
 立即注册
查看: 1535|回复: 3

[已解决]有关Array的问题

[复制链接]
发表于 2021-12-27 12:18:36 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

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

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

  1. package com.Sirui._01DayArrays;

  2. import java.util.Arrays;

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

  6.         System.out.println("num1本身: " + Arrays.toString(num1));
  7.         changeArray(num1);
  8.         //为什么这里的结果num1没有改变?
  9.         System.out.println("方法changeArray外结果: " + Arrays.toString(num1));//[1,1,1,1]
  10.         changeArray2(num1);
  11.         //为什么这里的结果num1发生了改变?
  12.         System.out.println("方法changeArray2外结果: " + Arrays.toString(num1));//[0,0,0,0]

  13.         int[] num3 = new int[]{ 1,1,1,1 };
  14.         int[] num2 = new int[]{ 0,0,0,0 };
  15.         num3 = num2;
  16.         //这里如果直接将num2的Value赋值给num3,结果会改变num3
  17.         System.out.println("直接将num2的Value赋值给num3的结果: " + Arrays.toString(num1));//[0,0,0,0]
  18.     }
  19.     static void changeArray(int[] nums) {
  20.         int n = nums.length;
  21.         int[] newArr = new int[n];
  22.         nums = newArr;
  23.         System.out.println("方法changeArray内结果: " + Arrays.toString(nums));//[0,0,0,0]
  24.     }
  25.     static void changeArray2(int[] nums) {
  26.         for (int i = 0; i < nums.length; i++) {
  27.             nums[i] = 0;
  28.         }
  29.         System.out.println("方法changeArray2内结果: " + Arrays.toString(nums));//[0,0,0,0]
  30.     }
  31. }
复制代码

  1. /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
  2. num1本身: [1, 1, 1, 1]
  3. 方法changeArray内结果: [0, 0, 0, 0]
  4. 方法changeArray外结果: [1, 1, 1, 1]
  5. 方法changeArray2内结果: [0, 0, 0, 0]
  6. 方法changeArray2外结果: [0, 0, 0, 0]
  7. 直接将num2的Value赋值给num3的结果: [0, 0, 0, 0]

  8. Process finished with exit code 0
复制代码
最佳答案
2021-12-27 20:17:31
本帖最后由 小伤口 于 2021-12-27 20:18 编辑

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

  1. package com.xiaoshangkou;

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

  11.     }
  12. }
复制代码

最终结果是nums里面的值也被影响到也会全部变成2
因为像直接用=复制这类都属于浅拷贝它只是将指向数组的引用复制过去
但他们都指向的是同一个内存地址,即同一个数组所以changeArray2里的值直接影响到nums
但changeArray 里面
  1. int[] newArr = new int[n];
复制代码

是new出来的一个数组相当于是在堆内存中重新开辟的数组,是一个全新的数组也就是深拷贝所以不会影响到外面的nums
这是我的个人理解,欢迎继续提问

这个是我的代码和输出结果

这个是我的代码和输出结果
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-12-27 14:22:53 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-12-27 20:17:31 | 显示全部楼层    本楼为最佳答案   
本帖最后由 小伤口 于 2021-12-27 20:18 编辑

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

  1. package com.xiaoshangkou;

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

  11.     }
  12. }
复制代码

最终结果是nums里面的值也被影响到也会全部变成2
因为像直接用=复制这类都属于浅拷贝它只是将指向数组的引用复制过去
但他们都指向的是同一个内存地址,即同一个数组所以changeArray2里的值直接影响到nums
但changeArray 里面
  1. int[] newArr = new int[n];
复制代码

是new出来的一个数组相当于是在堆内存中重新开辟的数组,是一个全新的数组也就是深拷贝所以不会影响到外面的nums
这是我的个人理解,欢迎继续提问
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-12-30 12:00:14 | 显示全部楼层
小伤口 发表于 2021-12-27 20:17
这就关系到深拷贝和浅拷贝的问题
你可以先看看下面这个小例子

谢谢!!
确实帮助到我理解!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-23 11:36

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表