Java 对节点主义者的理解

Java 对节点主义者的理解,java,nodes,Java,Nodes,我在理解基本节点列表的代码时遇到问题。节点(类ListNode)包含三个变量;一个字符串“key”,一个值“Value”,然后是另一个节点“next”。到现在为止,一直都还不错。但是,在名为ListMap的类中,我们有一个put()方法,我很难理解它: public void put(String key, int value) { ListNode l = search(key, head); if ( l==null ) { head = new ListNo

我在理解基本节点列表的代码时遇到问题。节点(类ListNode)包含三个变量;一个字符串“key”,一个值“Value”,然后是另一个节点“next”。到现在为止,一直都还不错。但是,在名为ListMap的类中,我们有一个put()方法,我很难理解它:

public void put(String key, int value) {
    ListNode l = search(key, head);
    if ( l==null ) {
        head = new ListNode(key, value, head);
    } else {
        l.value = value;
    }

protected static ListNode search(String key, ListNode l) {
    if (l==null) {
        return null;
    } else if (key.equals(l.key)) {
        return l;
    } else {
        return search(key, l.next);
    }
}
该方法搜索字符串“key”,如果列表中有一个,则用作为第二个参数的新值替换其值。
我无法理解的是这个变量l,它被分配给与第一个参数共享相同“键”或字符串的节点。
当l.value设置为value时,为什么会影响列表?
变量l不是列表中某个节点的副本,不是实际节点吗?
对于这样一个令人困惑的问题,我提前表示歉意,但我希望你们中的一位能够理解它

变量l不是列表中某个节点的副本,不是实际节点吗

不,它是对节点的引用(就像C语言中的指针)。您可以对同一对象有多个引用,当通过不同引用访问同一对象时,通过一个引用对该对象所做的更改当然是可见的。就像化名一样

以下是一个简化的示例:

class ListNode {
    int value;
}

ListNode first = new ListNode();
ListNode second = first;
first.value = 42;
System.out.println(second.value);  //42

谢谢你花时间。我明白了,但情况总是这样吗?它什么时候是引用,什么时候是副本,如果它曾经是副本的话?@user1772056:它永远不是副本,除非你在对象上显式调用
clone()
。这在普通Java开发中非常罕见。