[新手向]Java的一个新手天坑

瑞星  金牌会员 | 2022-12-20 16:16:04 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 851|帖子 851|积分 2553

Java新手天坑!
想写一篇新手避坑向的文章很久了,最近来到园子,终于有机会发表这篇文章了(文笔和技术都不咋地,大佬见谅,适用于刚入坑没多久的新手群体)
在java中,经过一段学习的人对数组操作应该是了如指掌了,但是刚刚入门的小白来说,数组却存在着一个隐藏的大坑,我们先用Python示例一下:
  1. #list.py
  2. arr1 = [5418,114514,666]
  3. arr2 = arr1
  4. arr1[0] = 1
  5. arr2[0] = 2
  6. print(arr1[0])
  7. print(arr2[0])
复制代码
程序输出结果为:
2
2
哎?

这,这不对吧?arr1 和 arr2 明明是两个不一样的列表,怎么arr2 改到arr1里了呢?
这是新手很容易遇到的问题,我们添加一行代码,来验证一下猜想。
  1. #依旧是list.py
  2. print(arr1 is arr2)
复制代码
啥意思呢,is不太常用,给大家解释一下,就是判断两个变量、列表(我通常称其为实体,更精确一些)在内存中的地址是否相同,如果相同的话,我们就知道问题发生的原因了。
程序输出如下:
2
2
True
果然,正是因为内存中的地址一样,所以更改arr2时,arr1也一同更改了,这俩货本质上一毛一样!
可以这么理解,数据是内存中的文件,arr1和arr2只是快捷方式。

我们把代码在java里实现:
  1. public class ListTest {
  2.     public static void main(String[] args) {
  3.         int[] a = {1,2,3};
  4.         int[] b = a;
  5.         a[0] = 10;
  6.         b[0] = 11;
  7.         System.out.println(a[0]);
  8.         System.out.println(b[0]);
  9.     }
  10. }
复制代码
一开始的内存如图所示:

后来arr1把114514位置的值修改为了10

最后arr1把114514位置的值修改为了11

最后二者的[0]都为11
你,学废了吗?

 

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

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

本版积分规则

瑞星

金牌会员
这个人很懒什么都没写!

标签云

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