3

因此,我一直在审查我的数据结构,但与具有指针的语言相比,我从来没有理解带有指针的事物的 java 实现最终是如何实际工作的。

java类中的树或列表是用一个节点类实现的,该节点类具有其他节点类,如果它是一棵树,则元素说左节点和右节点。

public class Node {
    private int data;
    private Node left;
    private Node right;
    ...
}

编译器是否知道只使用指针,或者所有这些都是按值完成的,并且我从树节点中保存了许多不同版本的相同值?

4

3 回答 3

3

在 Java 中,Node字段是引用。没有其他选项,因此不需要特殊符号。

于 2013-01-23T18:49:31.400 回答
3

尽管 java 没有显式使用指针,但它完全是面向指针的。没有指针 java 不起作用。在 java 中,“this”指针显式用于访问与对象关联的数据成员。

它们被称为“引用类型”。引用指向对象。基本上。没有办法“获取变量的地址”。但是您可以将变量的值复制到包装对象的字段中,然后可以通过引用指向该字段。

于 2013-01-23T18:52:45.850 回答
3

我发现在这件事上的混淆通常归结为不了解对象是如何在 Java 中传递的。

使用如下代码所示的 updateNodeData,您将按值传递引用的副本作为第一个参数。然后将修改该节点的数据(假设数据是public)。

类似地,nodeToBeChanged 的​​ leftNode 现在也将引用与传入 newLeftNode 相同的节点。不会克隆/创建具有复制值的新节点。

public void updateNodeData(Node node, int newValue){
    node.data = newValue;
}

public void setLeftNode(Node nodeToBeChanged, Node newLeftNode)
{
  nodeToBeChanged.leftNode = newLeftNode;
}

然而,经常令人困惑的是,因为它是按值传递的引用的副本,所以您不能像下面演示的那样交换两个节点。您将交换副本而不是实际参考。

public void swap(Node node1, Node node2)
{
  Node tmpNode = node1;     
  arg1 = arg2;
  arg2 = tmpNode;
}

现在回到最初的问题。如果要使用像这样的节点来实现节点树:

public class Node {
    private int data;
    private Node left;
    private Node right;
    ...
}

不会有同一个节点的不同克隆在整个地方浪费内存。它只是一长串节点和引用。

于 2013-01-23T22:48:56.783 回答