Java 修改当前实例的副本是否会影响当前实例?(爪哇)

Java 修改当前实例的副本是否会影响当前实例?(爪哇),java,c,list,pointers,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){ tem

昨天我对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;
}
...

}
public ADList拆分(K键){
//缓存当前列表
ADList temp=此;
//正在查找要拆分的密钥k
while(temp.head.key!=key&&temp.head.succ!=null){
温度头=温度头成功;
}
...
}
在这里,我保存了调用该方法的双链表的当前实例,以查找带有传递给函数的键的节点。我这样做是为了不修改当前实例的列表

但是我被告知这是错误的,并且副本
temp
实际上不是列表的副本,而是指向当前实例列表的指针的副本。这意味着函数将更改当前实例而不是副本

是我错了,还是那个人把Java和C混淆了?(哈哈)我真的很感激你的洞察力:)谢谢你

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

ADList<K, D> temp = this;
ADList temp=this;
存储对列表的引用,而不是列表本身

当你这样做的时候也是一样的:

ADList<K, D> list = ...
ADLlist<K, D> temp = list;  // not a copy, both refer to the same list object
ADList=。。。
ADLlist temp=list;//不是副本,两者都引用相同的列表对象
如果要制作副本,必须实现自己的机制,例如使用副本构造函数:

ADList<K, D> temp = new ADList<>(this);
ADList temp=新的ADList(此);
构造函数会做任何必要的事情来创建一个
ADList
,并将列表的相同内容传递给它的参数。这可能意味着为每个
节点
内部创建新的
节点
对象,其中包含相同的数据


鉴于您正在解决的问题,您似乎希望在给定的键上拆分一个链表。这比在
节点
级别操作要好得多。您可以遍历原始列表(即
),而无需修改它。然后为左侧和右侧子列表创建新节点(请参见示例)。

ADList temp=此
不会创建对象的副本。所以你没有错。谢谢!!现在明白了:)