2016-03-21 10 views
7

は、私は以下のようにいくつかの2つの文字列を持っています。代入演算子はJavaでメモリを消費しますか?</p> <p><code>"yes", "no"</code>:

さて、私は二つの方法でこれらの文字列を比較したいと思います:

直接

  1. 例:"yes".equals("no")

  2. いくつかの変数に文字列を割り当てることによって: 例:

    String string1 = "yes"; 
    String string2 ="no"; 
    string1.equals(string2); 
    

この2つのケースでは、メモリまたはパフォーマンスの違いはありますか?

+1

同じ性能 – Andrew

+1

このような小さなコードスニペットについて推論するのは難しいです。か否かの変数は、それらが割り当てられているかどうか、他の場所で参照され、そしてequals' 'の結果が実際に格納され、または使用されているか否かを大幅コンパイラが出力することを決定どのようなコード影響を与えることができます。プログラミングを考えるの – Pharap

+0

この方法では、パフォーマンスの増加なしで読めないコードを書くためにあなたを導くでしょう。 – Radiodef

答えて

14

非常にマイナーな違いは、(事実上無視できる、我々はここで、マイクロ最適化を話している)文字列は、対応するメソッドのスタックフレーム上のメモリの余分なビットを取るローカル変数に格納しなければならないので、あります。一方、定数は実際に定数プールに格納され、共有されます。呼び出しの数に基づいてJVMを最適化する可能性があるため、それは変わりません。

変数がfinalの場合は、バイトコードは同じであるか、実際にはfinal(1回だけ割り当てられます)ということに注意してください。この場合、それらは定数として扱われるからです。

+2

*変数が最終的なものであれば差はないことに注意してください。この場合、定数として効果的に扱われます。*>変数がコードのどこか別の場所に再割り当てされない場合、コンパイラはそれらを暗黙的に"final"キーワードが明示的に使用された場合に行われるのと同じ最適化を行います。 – errantlinguist

+4

ヒープがここに含まれているとは思わない。定数プール内の文字列への参照です。参照変数はAFAIKスタックに保持されます。 – Puce

+0

このコードでは、この割り当てを約100回実行します。次に、それはメモリとパフォーマンスを消費していますか? –

6

は、コンパイラによっては、それがスタック上の2つの追加オブジェクト参照のスペースがかかる場合があります、私は推測します。これらは、アプリケーションをプロファイリングしてそこに問題を発見しないかぎり(通常はそうでない場合)、通常は無視できます。 2つのリテラルが同じかそうでない場合は、すでに知っているだろうと

「はい」.equals(「なし」)実際のコードで

は、めったにこのような状況があります。

9

これらのコードスニペットをコンパイルすると、は同じバイトコードになります。したがって、メモリ消費またはパフォーマンスの差はありません。

代入演算子決してはメモリを消費します(オートボケの場合を除く):Integer number = 42)。ローカル変数宣言では、必要に応じてスタックにメモリを割り当てることができますが、コードの可読性を優先する必要があります。

+1

いくつかの定数(128?)より小さい数の場合、オートボクシングはメモリも消費しません。 – Cephalopod

+1

@Cephalopodあなたが正しいです、範囲[-128、127]の数値については、JLS7によって保証されています。5.1.7 – fRoStBiT

+0

上限が変更される可能性があるので、明示的に保証されているとは限りません。 –

関連する問題