gpt4 book ai didi

java - Java 中引用的概念问题

转载 作者:行者123 更新时间:2023-11-29 05:49:54 24 4
gpt4 key购买 nike

我在 java 中遇到引用的概念问题。这是我对基本 LinkedList 的实现:

节点:

class Node {
int data;
Node next = null;

public Node(int data) {
this.data = data;
}
}

列表:

class LinkedList {  
Node n = null;
Node start = null;
int flag = 0;

void insertion(int x) {
if(flag==0)
{
Node newnode = new Node(x);
n = newnode;
start = newnode;
flag = 1;
return;
}

Node newnode = new Node(x);
n.next = newnode;
n = n.next;
}

void deletion() {
Node str = start;
while(str.next.next != null)
str = str.next;
str.next = null;
}

void printlist() {
Node str = start;
while(str != null) {
System.out.println(str.data);
str = str.next;
}
}
}

测试类:

public class Test31 {
public static void main(String[] args){
LinkedList ll = new LinkedList();
ll.insertion(5);
ll.insertion(15);
ll.insertion(25);
ll.insertion(35);
ll.insertion(45);
ll.insertion(55);
ll.deletion();ll.deletion();
ll.printlist();
}
}

上面的程序运行良好,没有任何问题,但是如果我用这段代码替换 deletion():

void deletion() {
Node str = start;
while(str.next != null)
str = str.next;
str = null;
}

然后不会删除元素。我很想知道为什么会这样。使用 str.next.next 可以解决问题,但是如果我使用上面给出的删除方法,它不应该只通过 while 循环再迭代一次就可以达到同样的效果吗?

最佳答案

这是因为其中一个 str.next 对象仍然有对它的引用(或者可能 start 正在引用它)。通过将 str 设置为 null,您只是将该方法中的局部变量设置为 null,但是通过将 str.next 设置为 null,您正在删除该 str 对象中的引用。

简单的例子:

Node start = new Node();
Node another = new Node();
start.next = another;
Node toDelete = another;

如果你这样做:

toDelete = null;

在这种情况下,toDelete 现在是 nullstart.nextanother 仍然包含对最初分配给 another 的对象的引用。即使你附加这个:

another = null;

在这种情况下,还剩下一个引用。 start.next 仍然指向 another 最初分配给的原始对象。

我认为第一种删除方法实际上也是不正确的,因为它永远不会删除起始节点并且会抛出 NullPointerException 如果从 start.next< 开始只有一个节点在其中null 并且 while 循环试图到达 start.next.next。我认为这样更准确:

void deletion() {
Node parent = null;
Node current = start;
while (current.next != null) {
parent = current;
current = current.next;
}
if (parent == null) {
start = null;
flag = 0;
} else {
parent.next = null;
n = parent;
}
}

关于java - Java 中引用的概念问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14344779/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com