Java:在方法中将对象设置为 null 无效(重用代码)
Java : setting object to null within a method has no effect (Reusing code)
我正在尝试编写一种从二叉搜索树中删除节点的方法。这是我删除节点的方法。
public void delete(int deletionNodeValue) {
Node<Integer> nodeToBeDeleted = getNode(deletionNodeValue);
if(nodeToBeDeleted == null) return; // No node with such value exists throw an error
if(isLeafNode(nodeToBeDeleted)) {
nodeToBeDeleted = null;
} else if (nodeToBeDeleted.getNumChildren() == 1) {
bypassNode(nodeToBeDeleted);
}else {
replace(nodeToBeDeleted, getSuccessor(nodeToBeDeleted.getValue()));
}
}
我在一个叶子节点上检查了这个方法,调试后发现nodeToBeSelected=null
的执行发生了,节点实际上并没有被删除。因为我仍然可以搜索已删除的值并且程序仍然设法获取它。
tree.add(5);
tree.delete(5);
System.out.println(tree.getNode(5).getValue()); // Output : 5, should've been deleted
这是我的 getNode() 方法
public Node<Integer> getNode(int searchValue) {
Node<Integer> currentNode = root;
while(currentNode != null) {
int currentNodeValue = currentNode.getValue();
if(searchValue == currentNodeValue)
return currentNode;
else if(searchValue < currentNodeValue)
currentNode = currentNode.getLeftChild();
else
currentNode = currentNode.getRightChild();
}
// if no node with given value is found
return null;
}
getNode() 方法 return 是按值搜索找到的节点吗?如何让它return引用并直接操作找到的节点?[=15=]
当你在 delete
方法中说 nodeToBeDeleted = null;
时,你并没有真正导致 getNode
方法返回的 Node
开始指向 null
.
Java 总是 pass-by-value
。这意味着您不能使传递给方法的引用指向方法内的新内存位置。同样,您不能使方法调用返回的引用指向另一个方法中的新内存位置。 (即使位置是,好吧.. 为空)。
按照上面的解释,几乎不可能用getNode
的方法得到不想删除的Node
然后让这个节点指向一个null
在一些其他的方法。一个快速的解决方案是在 delete
方法中复制 getNode
方法中的代码。您应该在 Node
中添加 setLeftChild
和 setRightChild
方法(而不是像其他人建议的那样制作 leftChild 和 rightChild public )。然后您可以将其设置为 null,如下所示:
nodeToBeDeleted.setLeftChild(null)
当您将 nodeToBeDeleted
设置为 null
时,您只设置了保存对实际对象的引用的局部变量的值。实际对象不会以任何方式删除。
使用此处显示的代码,要删除节点,您应该找到其父节点并将对该节点(leftChild 或 rightChild)的引用设置为 null。这将确保该对象不被其父对象引用,可能不再被任何引用可见,因此符合垃圾收集条件。
您必须从树中删除节点,而不是在您的程序中本地删除。
Node<Integer> nodeToBeDeleted = getNode(deletionNodeValue);
为您提供树中节点的副本。
nodeToBeDeleted = null;
将此副本设置为空。与树的连接不会被删除,因为它是节点对象的一部分。要删除连接,您必须编写另一种方法来删除节点,这应该包含类似
的内容
parent.leftNode = null; // if nodeToBeDeleted == leftNode
parent.rightNode = null; // if nodeToBeDeleted == rightNode
我正在尝试编写一种从二叉搜索树中删除节点的方法。这是我删除节点的方法。
public void delete(int deletionNodeValue) {
Node<Integer> nodeToBeDeleted = getNode(deletionNodeValue);
if(nodeToBeDeleted == null) return; // No node with such value exists throw an error
if(isLeafNode(nodeToBeDeleted)) {
nodeToBeDeleted = null;
} else if (nodeToBeDeleted.getNumChildren() == 1) {
bypassNode(nodeToBeDeleted);
}else {
replace(nodeToBeDeleted, getSuccessor(nodeToBeDeleted.getValue()));
}
}
我在一个叶子节点上检查了这个方法,调试后发现nodeToBeSelected=null
的执行发生了,节点实际上并没有被删除。因为我仍然可以搜索已删除的值并且程序仍然设法获取它。
tree.add(5);
tree.delete(5);
System.out.println(tree.getNode(5).getValue()); // Output : 5, should've been deleted
这是我的 getNode() 方法
public Node<Integer> getNode(int searchValue) {
Node<Integer> currentNode = root;
while(currentNode != null) {
int currentNodeValue = currentNode.getValue();
if(searchValue == currentNodeValue)
return currentNode;
else if(searchValue < currentNodeValue)
currentNode = currentNode.getLeftChild();
else
currentNode = currentNode.getRightChild();
}
// if no node with given value is found
return null;
}
getNode() 方法 return 是按值搜索找到的节点吗?如何让它return引用并直接操作找到的节点?[=15=]
当你在 delete
方法中说 nodeToBeDeleted = null;
时,你并没有真正导致 getNode
方法返回的 Node
开始指向 null
.
Java 总是 pass-by-value
。这意味着您不能使传递给方法的引用指向方法内的新内存位置。同样,您不能使方法调用返回的引用指向另一个方法中的新内存位置。 (即使位置是,好吧.. 为空)。
按照上面的解释,几乎不可能用getNode
的方法得到不想删除的Node
然后让这个节点指向一个null
在一些其他的方法。一个快速的解决方案是在 delete
方法中复制 getNode
方法中的代码。您应该在 Node
中添加 setLeftChild
和 setRightChild
方法(而不是像其他人建议的那样制作 leftChild 和 rightChild public )。然后您可以将其设置为 null,如下所示:
nodeToBeDeleted.setLeftChild(null)
当您将 nodeToBeDeleted
设置为 null
时,您只设置了保存对实际对象的引用的局部变量的值。实际对象不会以任何方式删除。
使用此处显示的代码,要删除节点,您应该找到其父节点并将对该节点(leftChild 或 rightChild)的引用设置为 null。这将确保该对象不被其父对象引用,可能不再被任何引用可见,因此符合垃圾收集条件。
您必须从树中删除节点,而不是在您的程序中本地删除。
Node<Integer> nodeToBeDeleted = getNode(deletionNodeValue);
为您提供树中节点的副本。
nodeToBeDeleted = null;
将此副本设置为空。与树的连接不会被删除,因为它是节点对象的一部分。要删除连接,您必须编写另一种方法来删除节点,这应该包含类似
的内容parent.leftNode = null; // if nodeToBeDeleted == leftNode
parent.rightNode = null; // if nodeToBeDeleted == rightNode