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│
└───────────┘ └───────────┘