3

だから私は自分のデータ構造を見直してきましたが、ポインターを持つ言語と比較して、ポインターを持つものの Java 実装が実際にどのように機能するのか理解できませんでした。

Java クラスのツリーまたはリストは、他のノード クラスを持つノード クラスで実装されます。このノード クラスは、要素がツリーの場合、左右のノードを意味します。

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

コンパイラはポインタのみを使用することを知っていますか、それともすべて値によって行われており、ツリー ノードから同じ値のさまざまなバージョンが保存されていますか?

4

3 に答える 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;
}

ただし、よく混乱するのは、値によって渡される参照のコピーであるため、以下に示すように 2 つのノードのスワップを実行できないことです。実際の参照ではなく、コピーを交換します。

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 に答える
3

Java では、Nodeフィールドは参照です。他にオプションはありませんので、特別な記号は必要ありません。

于 2013-01-23T18:49:31.400 に答える
3

Java は明示的にポインターを使用しませんが、完全にポインター指向です。ポインターがないと Java は機能しません。Java では、「this」ポインターを明示的に使用して、オブジェクトに関連付けられたデータ メンバーにアクセスします。

それらは「参照型」と呼ばれます。参照はオブジェクトを指します。基本的に。変数の「アドレスを取る」方法はありません。ただし、変数の値をラッパー オブジェクトのフィールドにコピーすることはできます。

于 2013-01-23T18:52:45.850 に答える