2301_78343468 2024-03-20 19:28 采纳率: 45.5%
浏览 1
已结题

java数组扩展问题

img


写完后程序运行是正常的但有一些问题搞不懂,我for中写了arr=arr1就相当于把arr1的地址赋给了arr,原先的arr内容就销毁了,现在arr就和arr1共用一个房间。那下次循环当中写的arr1=new int[3+n]重新给arr1创造了更大的空间,里面的值都清0,这不想当把arr的空间也重新弄了一遍和arr1一样吗,那下面的for中arr1[i]=arr[i]不就无意义吗,最后打印出来的结果应该除了最后一个数其他都为0吗?下次循环难道说arr1=new int[3+n]是给arr1一个新的地址房间,不是在原有的arr1与arr共用的房间基础上再扩张?
那为什么我又重新写了个代码定义arr里面有1.2.3,然后再给arrnew int一个新空间,代码报错它说arr已定义。

  • 写回答

1条回答 默认 最新

  • 码农阿豪@新空间代码工作室 Java领域优质创作者 2024-03-20 19:28
    关注
    让阿豪来帮你解答,本回答参考chatgpt3.5编写提供,如果还有疑问可以评论或留言
    问题:为什么在for循环中,每次重新定义arr1之后,和arr共用的房间会被重新赋值为新开辟的空间,而不是继续共用? 回答: 在Java中,变量赋值时是通过传递引用实现的。当我们使用"="给一个变量赋值时,实际上是将一个指针赋给了这个变量,这个指针指向的是存储数据的内存地址。 对于数组来说,数组变量实际上存储的是一个指向数组首地址的指针。那么,当我们使用arr=arr1时,实际上是将arr指向了和arr1相同的数组首地址,也就是和arr1共用同一个数组内存空间。因此,当我们在for循环中重新赋值arr1后,arr所指向的内存空间也被重新赋值了,因为它和arr1共用同一个内存空间。 具体来说,当我们使用arr1=new int[3+n]时,Java会为arr1分配一块新的内存空间,并将arr1指向这个新的内存空间的首地址。此时,arr所指向的内存空间仍然是原来的内存空间。但是,在下一轮循环开始前,我们又使用arr=arr1重新将arr指向了arr1所指向的内存空间,即新开辟的内存空间。因此,当我们执行arr1[i]=arr[i]时,实际上是把新开辟的内存空间的值赋给了原本指向的内存空间的值,导致结果不符合预期。 代码示例: // 错误示例 int[] arr = {1, 2, 3}; for (int n = 1; n <= 2; n++) {
    int[] arr1 = arr;
    arr1 = new int[3+n];
    for (int i = 0; i < arr.length; i++) {
        arr1[i] = arr[i];
    }
    arr = arr1;
    

    } System.out.println(Arrays.toString(arr)); // [0, 0, 0, 0, 0, 0] // 正确示例 int[] arr = {1, 2, 3}; for (int n = 1; n <= 2; n++) { int[] arr1 = new int[3+n]; System.arraycopy(arr, 0, arr1, 0, arr.length); arr = arr1; } System.out.println(Arrays.toString(arr)); // [1, 2, 3, 0, 0, 0]

    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 3月29日
  • 创建了问题 3月20日

悬赏问题

  • ¥66 换电脑后应用程序报错
  • ¥50 array数据同步问题
  • ¥15 pic16F877a单片机的外部触发中断程序仿真失效
  • ¥15 Matlab插值拟合差分微分规划图论
  • ¥15 keil5 target not created
  • ¥15 C/C++数据与算法请教
  • ¥15 怎么找志同道合的伙伴
  • ¥20 如何让程序ab.eXe自已删除干净硬盘里的本文件自己的ab.eXe文件
  • ¥50 爬虫预算充足,跪巨佬
  • ¥15 滑块验证码拖动问题悬赏