引用类型和基本类型在方法传递中的不同行为

本文探讨了在Java编程中,引用数据类型作为方法参数时可能出现的问题。当使用相同的引用添加到列表时,由于对象引用的共享,可能导致最终结果出乎意料。通过实例分析,解释了为何在深度优先搜索后,列表会变成空。解决方案是使用`new ArrayList<>(list)`创建对象副本,避免原始列表被修改的影响。文章强调了理解基本类型与引用类型的区别对于防止意外数据更改的重要性。
摘要由CSDN通过智能技术生成

今天在刷lc时,又发现了个小问题。描述如下:在这里插入图片描述
红色部分是最开始写的代码,得到满足sum==target的结果后,就将list加入到AllSets这个Arraylist中,一开始觉得没有什么问题,但是运行过后出现了下面的结果:
在这里插入图片描述
可以看到最终传入allSets中的竟然是两个空列表!这是为什么?

发现问题根源:可以看出,这个list 是由其他函数传入的参数,是一个引用类型,所以当我们只是单纯的进行allSets.add(list)时,只是把list的地址传递给了allSets,而list在深度优先搜索的最后,其实是一个空列表,因为每次添加元素后都会进行remove,所以最终加入到allSets的两个list最终其实都是空的,这也就是导致了以上的结果。这个相当于两个人复习,用同一份复习资料,其中有个人把资料撕掉了。
那么如何去解决?: 我们只需要将代码修改为allSets.add(new ArrayList<>(list));即可,这样就相当于是创建了一个新的ArrayList对象,其内容是list 的值,等于我们创建了一个副本,就算原来的list怎么改变,也不会去改变副本的值。这个相当于两个人复习,用两份复习资料。在这里插入图片描述总结:

  1. 当使用基本数据类型作为方法的形参时,在方法体中对形参的修改不会影响到实参的数值。
  2. 当使用引用数据类型作为方法的形参时,若在方法体中修改形参指向的数据内容,则会对实参变量的数值产生影响,因为形参变量和实参变量共享同一块堆区;在方法中对数组内容顺序进行交换,结果会影响实参。
  3. 当使用引用数据类型作为方法的形参时,若在方法体中修改形参变量的指向,此时不会 对实参变量的数值产生影响,因此形参变量和实参变量分别指向不同的堆区;在方法中将数组a指向数组b,不会影响实参。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值