2016-08-25 7 views
-1

私はBSTがJavaとC++で実装される方法を比較しようとしています。 Javaでは、ノードはバイナリ検索ツリーは、ポインタなしでJavaではどのように機能しますか?

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

やCのようになります++、それは次のようになります。

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

私はなぜJavaのアプローチが機能しているように混乱しています。私は、C + +で左と右は、次のノードを含むメモリの領域を指し示すポインターであることを理解しています。 Javaでは、すべてがどのように接続されているのか、実際にはわかりません。左と右はノードへのポインタではなく、ノードそのものなので、Javaの各Nodeオブジェクトは3つのノード(1つは自分自身、もう1つはその子ノード)のスペースを占有しますか?誰かが実際にどのノードがどのくらい正確に接続されているのか、メモリ割り当ての違いという点で実際に何が起こっているのか説明できれば、非常に役に立ちます。

また、C++でも同じことができますか?ポインタの代わりにNode leftとNode rightを持つことができますか?もしそうなら、最初にポインタを使う利点は何ですか?ありがとうございました!

Javaコードで
+2

Javaは参照を使用しています。 C++にも参照があります。一部の言語には参照がありません。 –

+3

Javaはほとんどすべてのポインタを使用します。変数をオブジェクトと同じに設定するたびに、オブジェクトへのポインタを格納するだけです。違いは、Javaはあなたが直接ポインタにアクセスしたり、ポインタを操作したり、数学をすることを許さないということです。自動的かつ時にはシームレスに処理します。 – kbelder

+0

@ArchbishopOfBanterburyいいえ、これは意味がありません。あなたが言ったように、 'left'と' right'が '' binary_search_tree'インスタンスであれば、このクラスを使うたびにランタイムエラーが発生します。メモリの割り当てが停止しません)。 Javaの参照はインスタンスではありません。インスタンスを参照に割り当てることもできますが、 'null'でもかまいません(' null'はインスタンスのインスタンスではありません)。 – Xiobiq

答えて

6

クラスタイプ(leftright)メンバ宣言暗黙宣言ポインタ。ほとんどのものはポインタを使って処理されるため、Javaのポインタには特別な表記法はありません。これらは、ポインタと呼ばれ、はJava言語仕様ですが、ほとんどのJavaプログラマはの参照と知られています。

例では、基本的にJavaとC++で異なる構文ですが、C++ポインタもC++参照もJavaポインタに直接対応していないことに注意してください。

注意:Javaにポインタがないという引数が発生することがあります。何らかの理由で私はgrokできません(彼らが好きな言語の仕様に慣れていない理由、なぜ彼らが画面上でNullPointerExceptionを取得するのを無視できるのでしょうか?)いくつかのJavaプログラマーは言語にポインタがあることを強く拒否します。これは謎ですが、無視しても間違いないと思います。

+0

CまたはC++でポインタを操作するのと同じ方法で、Java参照を操作することはできません。もちろん、CやC++では何かへのポインタを作成できますが、Javaではプリミティブ型への参照を取得できません。 – NullUserException

+0

私はしばしば、このポインタ恐怖症について疑問を抱いていました。多分、Cのポインタは単一のオブジェクトを指す以上のことをするからです。 – juanchopanza

+0

私が正しく理解すれば、上の2つのコードスニペットは本質的に同じことをします。ポインターを使わずにNodeクラスをC++で書いたとしたらどうなるでしょうか?上記2と全く違うでしょうか? –

関連する問題