2017-11-08 17 views
-1

私は文字列ビルダのための新しいオブジェクトを作成し、メモリ割り当ての仕事と何が私のコードの結果がどのようにその変数を使用して、私のサンプルコードは可変メモリ割り当てはどのように機能しますか?

1であるスニペット)

String nextPoint=new StringBuilder().append("My").append("next").append("point").toString(); 

System.out.println(nextPoint); 

2)

StringBuilder downPoint=new StringBuilder().append("My").append("next").append("point"); 

System.out.println(downPoint.toString()); 

どの変数/インスタンスがメモリを消費できますか?私は "nextPoint" varaibleまたは "downPoint"変数を使用している方が良いでしょうか?

答えて

1

どの変数/インスタンスがメモリを消費できますか?

すべてのクラスがメモリを占有します。どのくらいのクラスに依存します。すべてのオブジェクトがヒープメモリを占有します。どのくらいそのクラスに依存します。多くのクラスとオブジェクトには他のオブジェクトへの参照も含まれており、他のオブジェクトは独自のヒープメモリを占有します。いくつかのオブジェクトには固有のリソースが関連付けられており、固有の量のメモリを占有します。ローカル変数は、そのタイプに適したスタックメモリを占有しますが、状況によっては、特定のローカル変数が他のものと同じスタックメモリを共有することがあります。あなたのケース(1)では

String nextPoint=new StringBuilder().append("My").append("next").append("point").toString(); 

System.out.println(nextPoint); 

変数nextPointは、(参考のため、全体ではなくString)スタックメモリを消費し、ローカル参照変数です。これは、新しいStringBuilderオブジェクト(ヒープ上)を作成し、3つの文字列(それぞれヒープメモリを占有するオブジェクト)を追加し、次に新しいStringオブジェクト(ヒープメモリを占有する)を作成し、その参照を格納することによって初期化されますnextPointにあります。 StringBuilderには、蓄積された文字データのための何らかの関連ストレージがあります。これは関連するStringのどれとも重複しません。

あなたのケース(2)は、Stringへの参照の代わりにStringBuilderへの参照が保持されるという点でのみ異なります。それは後続のコードに影響を与えるかもしれませんが、どのオブジェクトが作成され、どのメモリが必要であるかには何の違いもありません。

私は "nextPoint" varaibleまたは "downPoint"変数を使用している方が良い解決法ですか?

これは、後で何をしたいかによって異なります。これらの変数のどちらかをもう一度使用しない場合は、純粋に文法的な違いがあります。私のコードスニペットの結果が何であるかを

[?]

、クラスでそれを入れて、それを実行し、そして自分のために見つけます。それとも、コードからそれを理解するか。これは私たちがあなたのために答える必要があるものではありません。

0

両方スニペットは、

new StringBuilder().append("My").append("next").append("point").toString()ある、

をメソッド呼び出しの同じシーケンスを行うので、そのメモリ使用量が(ほとんど)同じです。スニペット(1)はStringBuilderへの参照を変数に格納し、(2)結果のString参照を格納します。しかし、参照が同じサイズであるため、参照先が何であれ、同じバイト数が占有されます。

関連する問題