不久前,我在c中实现了一个LinkedList。它非常直接,因为每个节点都是由一个值和另一个指向列表中下一个元素的指针组成的。但现在我试图在Java中实现一个LinkedList,因为没有指针,我做了一个这样的节点:
public class MyNode{
int value;
MyNode next;
public MyNode(int i){
value = i;
next = null;
}
}
现在我们说这个:
MyNode n1 = new MyNode(1);
MyNode n2 = new MyNode(2);
n1.next = n2;
MyNode n3 = new MyNode(3);
n2 = n3;
如果我这样做会得到什么
System.println(n1.next.value);
会得到2还是3?我在C语言中遇到的主要问题是,我并不真正理解java是如何移动数据的。它是把n2复制到n1还是n1只指向n2?
与指针(Java中称为引用)进行类比:
你可以考虑变量(n1 n2 n1)Next等)作为指向内存中某个对象的指针。因此,new Node(2);
创建了一个节点并将其放在内存中,n2 = ...
使变量n2
指向该节点的"地址"。
当您写n1.next = n2;
时,您通过将该地址的值复制到n1.next
使n1.next
指向相同的"地址"。
当你以后写n2 = n3;
的时候,你让n2
变量指向一个不同的"地址",但是n1.next
仍然指向你最初的new Node(2)
对象的地址。
底线:System.out.println(n1.next.value);
打印2,而不是3。
一个相关的帖子:是Java "通过引用传递"或"pass-by-value" ?
响应为2。
n1。next将继续指向您的实例MyNode(2);在n2 = n3之后, n2指向n3,但是您将在n1.next上保留一个实例MyNode(2)的引用。
GarbageCollector只会收集没有任何引用的对象实例。在本例中,您将继续在n1上引用实例(MyNode(2))。next
在java中,变量总是通过值传递。Java将对象作为引用通过值传递。
例如,代码
MyNode n1 = new MyNode(1);
MyNode n2 = new MyNode(2);
n1.next = n2;
MyNode n3 = new MyNode(3);
n2 = n3;
以这种方式执行。
创建值为1的新节点n1
创建值为2的新节点n2
设置对象n1。n2旁边
创建值为3的新节点n3
将n2引用的对象替换为n3引用的对象(不替换
n1.next
的引用
所以你呼叫
System.out.println(n1.next.value);
打印2 .