Java 为什么列表即使按值传递也会更新? 公共类节点{ T数据; 节点下一步; 节点(T数据){ 这个数据=数据; } } 公共类链接列表{ 公共静态无效打印(节点头){ 节点温度=头; while(temp!=null){ 系统输出打印(温度数据+“”); 温度=下一个温度; } System.out.println(); } 公共静态无效增量(节点头){ 节点温度=头; while(temp!=null){ 温度数据++; 温度=下一个温度; } } 公共静态void main(字符串参数[]){ 节点node1=新节点(10); 节点node2=新节点(20); node1.next=node2; 增量(节点1); 打印(node1); } }

Java 为什么列表即使按值传递也会更新? 公共类节点{ T数据; 节点下一步; 节点(T数据){ 这个数据=数据; } } 公共类链接列表{ 公共静态无效打印(节点头){ 节点温度=头; while(temp!=null){ 系统输出打印(温度数据+“”); 温度=下一个温度; } System.out.println(); } 公共静态无效增量(节点头){ 节点温度=头; while(temp!=null){ 温度数据++; 温度=下一个温度; } } 公共静态void main(字符串参数[]){ 节点node1=新节点(10); 节点node2=新节点(20); node1.next=node2; 增量(节点1); 打印(node1); } },java,data-structures,linked-list,output,singly-linked-list,Java,Data Structures,Linked List,Output,Singly Linked List,由于node1在函数increment中通过值传递(而不是通过引用传递),因此根据我的说法,输出应该是10 20,但解决方案是11 21 你能帮我解释一下吗?调用increment将改变列表。也许这有助于形象化列表。执行node1.next=node2后,我们得到以下情况: public class Node<T> { T data; Node<T> next; Node(T data){ this.data = data;

由于
node1
在函数
increment
中通过值传递(而不是通过引用传递),因此根据我的说法,输出应该是10 20,但解决方案是11 21


你能帮我解释一下吗?

调用
increment
将改变列表。也许这有助于形象化列表。执行
node1.next=node2
后,我们得到以下情况:

public class Node<T> {
    T data;
    Node<T> next;
    Node(T data){
        this.data = data;
    }
}


public  class LinkedListUse{

    public static void print(Node<Integer> head){
        Node<Integer> temp = head;
    
        while(temp != null){
            System.out.print(temp.data +" ");
            temp = temp.next;
        }
        System.out.println();
    }
    
    public static void increment(Node<Integer> head){
        Node<Integer> temp = head;
        while(temp != null){
            temp.data++;
            temp = temp.next;
        }
    }
    
    public static void main(String args[]){
    
        Node<Integer> node1 = new Node<Integer>(10);
        Node<Integer> node2 = new Node<Integer>(20);
        node1.next = node2;
        increment(node1);
        print(node1);
    }
}
然后,
increment(node1)
将定义另外两个引用
node1
的变量:

 node1           node2
  ↓               ↓
┌───────────┐   ┌───────────┐
│ data: 10  │   │ data: 20  │
│ next: ──────> │ next: null│
└───────────┘   └───────────┘
在其
while
循环中,它将首先递增
温度数据(因此变为11),然后将
temp
参考移动到
节点2

 head
 temp 
 node1           node2
  ↓               ↓
┌───────────┐   ┌───────────┐
│ data: 10  │   │ data: 20  │
│ next: ──────> │ next: null│
└───────────┘   └───────────┘
在第二次迭代中,
node2
(=
temp
)的
数据将增加,并且
temp
移动到
temp。下一次
null

 head            temp 
 node1           node2
  ↓               ↓
┌───────────┐   ┌───────────┐
│ data: 11  │   │ data: 20  │
│ next: ──────> │ next: null│
└───────────┘   └───────────┘
因此,尽管对
temp
的更改不会影响对
node1
的引用,但即使对
increment
的调用已完成,对引用节点的任何变异都将保留。再也没有10的值了,也没有20的值了。这些已被覆盖


当调用
print
方法时,会发生与调用
increment
时类似的事情,只是现在没有给节点带来突变。它将找到调用
increment
后留下的节点。没有其他节点。

在Java中,所有节点都是按值传递的,但传递的值是什么?如果是对象,则为引用。所以很明显,当有引用时,对象属性可以改变。这回答了你的问题吗?非常一般的建议:这类问题通常通过放置程序的中间输出来解决。在代码的中间添加“<代码>系统.out .PrtLnn(…)>代码>以查看发生了什么。”Luia. FaluIt:如果混淆是关于通过自然引用的确切性质,那么这只会加深混乱。他们必须试图纠正他们对传递引用本质上是什么的误解(重复的问题有一些很好的答案可以帮助解决这个问题)。
 head                             temp==null 
 node1           node2
  ↓               ↓
┌───────────┐   ┌───────────┐
│ data: 11  │   │ data: 21  │
│ next: ──────> │ next: null│
└───────────┘   └───────────┘