昨天我有一个关于 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/