为什么我需要另一个新的ArrayList而不是将现有的传递给ArrayList?

为什么我需要另一个新的ArrayList而不是将现有的传递给ArrayList?,第1张

为什么我需要另一个新的ArrayList而不是将现有的传递给ArrayList?

正如另一个答案所说,这样做:

res.add(r)

r
在列表中添加对同一对象引用。实际上,这里发生的是:

  • r
    指清单
  • 该引用作为参数传递给
    add
  • 对列表的引用存储在内部
    res

但是请注意,两者

r
和内部的引用
res
都指向 同一个对象

当您执行此 *** 作时,

temp
会发生以下情况:

  • 创建一个新列表,并用引用原始列表中所有数据的副本
    r
  • 此列表已分配给
    temp
  • 对新列表的引用作为参数传递给
    add
  • 对列表的引用存储在内部
    res

因此,现在

r
指向列表的原始副本,而内部引用
res
指向列表的新副本。它们是两个不同的对象。

为什么这很重要?

基本上,您的递归步骤向中添加一个元素

r
find
再次调用,然后从中删除一个元素
r
r
res
中的引用沿递归传递,这意味着这两个相同的对象沿递归传递。

但是由于从递归中返回后,您主动从中删除了一个对象

r
,这意味着最后,当您完全向上移动时,内部将不再有元素
r

由于存储在内部的引用

res
指向的 是同一对象
r
,而不是其副本,因此,当您使用删除项目时
r.remove()
,该对象将变为空。但这是我们从内部引用的对象
res
。因此,在递归结束时,它将为空。

认为它是安全的。A人用金钱装满保险柜。然后,他将B人的第二把钥匙交给保险箱。然后,他用原来的钥匙进入,取出了所有的钱。当B来打开保险柜时,它是空的!

复制此列表等效于A给予B自己的钱以放入自己的保险箱。A可以从自己的保险箱中取出任意多的钱,而且不会改变B保险箱中的钱数。



欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5498680.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-12
下一篇 2022-12-12

发表评论

登录后才能评论

评论列表(0条)

保存