2016-07-02 1 views
0

Cバージョンではノードのアドレス、つまりNode *のみが保存されていますが、Javaバージョンでは、ノード全体が保存されます。Javaでツリーを実装すると、C言語でアドレスを保持している次のノードv/s全体が保持される

これは、実行するJavaコードがCコードと比較してより多くのメモリを占有することを意味しますか?

Cバージョン

#include <stdio.h> 
#include <malloc.h> 

typedef struct node 
{ 
int data; 
struct node* left; 
struct node* right; 
}Node; 
Node* root; 

void inorder(Node* node) 
{ 
if(node == NULL) 
    return; 

inorder(node->left); 
printf("%d ",node->data); 
inorder(node->right); 
} 

void insert(int data) 
{ 
printf("inside insert, data == %d",data);  

Node* node = malloc(sizeof(Node)); 
node->data = data; 
node->left = NULL; 
node->right = NULL; 

if(root == NULL) 
{ 
    printf("inserting %d as root",node->data); 
    root = node; 
} 
else 
{ 
    Node* trav = root; 
    Node* pretrav = root; 
    while(trav != NULL) 
    { 
    pretrav = trav; 
    if(node->data < trav->data) 
    trav = trav->left; 
    else 
    trav = trav->right; 
    } 

    if(node->data < pretrav->data) 
    { 
     printf("inserting %d to the left of %d",node->data, pretrav->data); 
    pretrav->left = node; 
    } 
    else 
    { 
     printf("inserting %d to the right of %d",node->data, pretrav->data); 
    pretrav->right = node; 
    } 
} 
} 

int main(void) 
{ 
int a[] = {10,5,15,1,20,100}; 
int i = 0; 

for(i = 0;i<sizeof(a)/sizeof(a[0]);i++) 
{ 
    insert(a[i]); 
    printf("\n"); 
} 

inorder(root); 

return 0; 
} 

Javaバージョン

package lastcommon; 

public class TreeExample { 

    public static void main(String[] args) { 
     // TODO Auto-generated method stub 

     Tree tree = new Tree(); 
     tree.insert(10); 
     tree.insert(5); 
     tree.insert(15); 
     tree.insert(1); 
     tree.insert(20); 
     tree.insert(100); 

     System.out.println("Printing inorder... "); 
     tree.inorder(tree.root); 
    } 

} 

class Node 
{ 
    int data; 
    Node left; 
    Node right; 

    public Node() { 
     // TODO Auto-generated constructor stub 
     left = right = null; 
    } 
} 

class Tree 
{ 
    Node root; 

    public Tree() { 
     // TODO Auto-generated constructor stub 
     root = null; 
    } 

    void inorder(Node node) 
    { 
     if(node == null) 
      return; 

     inorder(node.left); 
     System.out.println(node.data); 
     inorder(node.right); 
    } 

    void preorder(Node node) 
    { 
     if(node == null) 
      return; 

     System.out.println(node.data); 
     preorder(node.left); 
     preorder(node.right); 
    } 

    void postorder(Node node) 
    { 
     if(node == null) 
      return; 

     postorder(node.left); 
     postorder(node.right); 
     System.out.println(node.data); 
    } 

    void insert(int data) 
    { 
     Node node = new Node(); 
     node.data = data; 

     if(root == null) 
     { 
      root = node; 
      return; 
     } 

     Node trav = root; 
     Node pretrav = root; 
     while(trav != null) 
     { 
      pretrav = trav; 
      if(node.data < trav.data) 
      { 
       trav = trav.left; 
      } 
      else 
      { 
       trav = trav.right; 
      } 
     } 

     if(node.data < pretrav.data) 
      pretrav.left = node; 
     else 
      pretrav.right = node; 
    } 
} 

答えて

3

JavaはCは、ポインタを使用しています非常に同じ方法で参照を使用しています。それらは関連していますが、ポインタを操作できるように参照を操作することはできません。使用するのが安全になります(プログラムがクラッシュする可能性は低くなります)。

newが呼び出されるたびにリファレンスが作成されます。 insertメソッドを調べると、new Node(...)が呼び出され、新しいオブジェクトが作成され、新しいオブジェクトへの参照が返されることがわかります。

あなた自身のコードでこのような参照を使用するときは、変数に保存されるのはオブジェクト全体ではなく "ポインタ"だけです。

+0

ありがとうございます。新しいキーワードを使用すると、クラスの新しいインスタンスが作成され、新しく作成されたインスタンスのアドレスが返されます。私が想定したように、新しく割り当てられたブロック全体を返さないのですか? – saltandwater

+0

はい。これは直感的ではありません。 –

+0

Cでnode.dataはノードが実際のメモリブロックであり、node-> dataだけがノードによって保持されているアドレスに対応するブロックであることを意味するので、最初は混乱しました。しかし、Javaでは、node.data自体は、ノードが保持するアドレスのブロックです。 – saltandwater

0

Cの低レベルのパワーの1つがメモリ管理です。ポインタを使用するときは、メモリアドレスを使用します。そのようにして、Javaの代わりに小さなメモリを充電することができます(オブジェクト全体を充電し、すべての標準的な方法、遺産...)。

ほとんどの場合、Cは実行時にメモリのサイズを小さくすることができます。一方、Javaはメモリの大きなブロック(オブジェクトにベース)を割り当てるために使用しますが、より快適で安全です(彼らがそこに言ったように)。そして、あなたは "現実の"問題について考えましょう。

関連する問題