Java和C++/C树实现,底层的运作原理是什么?

3

我一直在回顾我的数据结构,但我从未理解过Java中指针相关的实现方式,相较于那些有指针的编程语言。

在Java中,树或列表的类是通过一个节点类来实现的,该节点类具有其他节点类作为元素,例如左节点和右节点(如果是树形结构)。

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

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


一个对象的引用就是一个指向该对象的引用。 - Dave Newton
1
简而言之,编译器知道对于所有对象类型都要使用指针(且仅使用指针)。 - Jochen
https://dev59.com/k2s05IYBdhLWcg3wG-VR - Mat
4
引用本质上是一个指针,但只能进行解引用操作,不支持指针运算。 - ignis
你为什么认为Java没有指针? - Patricia Shanahan
3个回答

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;
    ...
}

同一个节点不会存在于不同的位置进行克隆,以此浪费内存。整个过程只是一条长链,由节点和引用构成。


感谢您的帮助,这确实增进了我的基本理解:) 感谢所有评论/贡献的人! - Fatlad

3

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


3
尽管 Java 没有显式地使用指针,但它完全是指针导向的。没有指针 Java 就无法工作。在 Java 中,“this”指针被明确地用于访问与对象关联的数据成员。
它们被称为“引用类型”。这些引用指向对象。基本上,没有办法“取地址”变量。但你可以将变量的值复制到包装对象的字段中,然后可以通过引用指向该对象。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接