java - 修改当前实例的副本会影响当前实例吗? ( java )

标签 java c list pointers

昨天我有一个关于 Java 双向链表的问题,我的这部分代码有一个令人困惑的评论

public ADList<K,D> split(K key){

// caching the current list
ADList<K, D> temp = this;

// looking for the key k to be split on
while(temp.head.key != key && temp.head.succ != null){
    temp.head = temp.head.succ;
}
...

}

在这里,我保存了调用该方法的双向链表的当前实例,以查找具有传递给函数的键的节点。我这样做是为了不修改当前实例的列表。

但有人告诉我这是错误的,副本 temp 并不是真正的列表副本,而是 指向列表的指针 的副本当前实例的。这意味着该函数将更改当前实例而不是副本。

我错了吗,还是那个人把 Java 和 C 搞混了? (笑)我真的很感激一些见解 :) 非常感谢!

最佳答案

您实际上是在存储对当前列表的引用。所以现在对 temp 的更改将影响 this,并且您的方法将更改原始列表。想想看:

ADList<K, D> temp = this;

存储对列表的引用,而不是列表本身。

当你做同样的事情:

ADList<K, D> list = ...
ADLlist<K, D> temp = list;  // not a copy, both refer to the same list object

如果要复制,则必须实现自己的机制,例如使用复制构造函数:

ADList<K, D> temp = new ADList<>(this);

构造函数会做任何必要的事情来创建一个 ADList,并将列表的相同内容传递给它的参数。这可能意味着在内部为每个 Node 创建新的 Node 对象,其中包含相同的数据。

考虑到您要解决的问题,您似乎想要在给定键上拆分链表。在 Node 级别操作要好得多。您可以遍历原始列表(即 this)而无需修改它。然后为左右子列表创建新节点(示例参见 Divide a linked list into half and return the second half)。

关于java - 修改当前实例的副本会影响当前实例吗? ( java ),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67232240/

相关文章:

java - 如何检测重叠的圆圈并相应地填充颜色?

c - 使用(void **)传递(double ***)指针可以吗?

c - 如何在 C 中返回匿名结构?

c# - 将 2 个列表连接成 1 个 C# 问题

list - F#:递归函数:将列表分为两个相等的部分

java - 如何配置 tomee 通过 https 运行?

java - ClassNotFoundException : org. flywaydb.core.api.callback.FlywayCallback

java - 从 viewpager 切换选项卡

c - TCP接收缓冲区

c++ - 从列表中删除特定对象 (c++)