2017-11-13 4 views
0

私はNodeのバイナリツリーを持ち、それを横断したいと思っています。私が見ている最も一般的な方法はStack、またはLinkedListです。私はまた、各Nodeをスタック/リストに追加しない方法を見てきました。ほとんどの場合、各要素を探索するために再帰を使用します。配列を指すJavaスタックは同じ量のメモリを使用しますか?

List<Node>をツリー内の各ノードをトラッキングするように設定すると、メモリの量は2*nになりますか?または、オブジェクトがツリー内にすでに存在するため、リストはノードオブジェクト(Tree内に存在する)へのポインタの集まりに過ぎず、したがってメモリの2倍を占有しませんか?

テストケース:

Object objs[] = new Object[40]; 
/* 
    Initialize the 40 objects here 
*/ 
List<Object> objTracker = new List<>(); 
for(int i=0; i<objs.length; i++) { 
    objTracker.add(objs[i]); 
} 

これは今2倍にメモリの量を取る、またはobjsに格納されているオブジェクトにobjTrackersだけリダイレクト/ポイントのすべてをするのでしょうか?

答えて

2

newキーワード(一般的には)を使用する場合にのみ、新しいオブジェクトを作成します。 objTracker.add(objs[i]);にはnewが存在しないため、新しいオブジェクトは作成されません。

+0

アレイでそれらを追跡している場合はどうなりますか?最初の配列のオブジェクトへのポインタの2番目の配列(抽象的には、Javaが明示的に許可しないので)は、配列2の新しいオブジェクトセットを作成するのと同じ量のメモリを使用しますか? –

+2

もちろんです。あなたがそれにバナナを入れた箱を持っていて、そこに "箱1を見る"と書いてあるメモが入っている2番目の箱があれば、どれくらいのバナナがありますか?メモを含むボックスを追加するとどうなりますか?コンテナオブジェクト(ボックス、配列、リスト)と参照(注釈)のみが追加されます。 – Kayaman

+0

さて、配列作成では、私は 'new'を使っています。で示されるように、 'object [] objs = new Object [30];'。私はそれが30スロットのための十分なスペースをメモリに確保すると思った。もしそうなら、なぜ私は各スロットを 'new Object()'に割り当て始めたら、もっとスペースを取るべきでしょうか? –

1

Javaでは、スタックメモリはヒープメモリとは別です。スタックメモリはすべてのメソッド呼び出しで消費されますが、GCによって管理されていないため、呼び出しが返されるとすぐに解放されるため、通常は「占有」メモリとしてカウントされません。

最後に、オブジェクトをどこかに保存する必要があります。だから、スタックかヒープのどちらかです。あなたがそれらのサイズを全体的に配分していないなら、リストと配列は匹敵するスペース要件を持っています。あなたのコードでは、どのノードも割り当てていません。既に存在しています。 array/Listのためのスペースしか割り当てていません。

あなたのコードで何をしているのかはおそらく冗長です。最初にListにelemetsを追加することができます。今のところ、オブジェクトを配列に格納してから、リストにコピーします。 objsをそれ以上使用しない場合は、最終的にobjsがガベージコレクションされ、メモリにはobjTrackerだけ残されます。

+0

右...それは、私が意味するものを説明するための単なる例でした。間違いなく冗長になるでしょう。 OK。私は、データのバイナリツリーを横断するためにスタックを使用した場合、データを複製しないことを確認したかったのです。それは私が望んでいたものではないようですが、私は実装前に確かめたいと思っていました。ありがとう! –

+0

彼は内部スタックではなく、 'Stack'クラスを参照していました。ここでスタック割り当てについて話を始めないでください。混乱するだけです。 – Kayaman

関連する問題