2016-07-07 4 views
-2

私はこの回答を全部見ており、答えがイエスだと思うように傾いています。リストから文字列を取得して作成すると、スタック上にlitteralが作成されますか?

私は静的コード分析に役立つミニアプリを作成しています。できるだけ速く動かすために、私はgroovy/javaを使ってImがどのようにこれらの文字列を処理するのかを理解する必要があります。私が午前問題は、コードの理解天気です。文はPattern.matcher(によって作成された文字列が保存されている場合としながらでの比較に使用した場合)

space.matcher(line.get(index)).replaceAll("") 

または

line.get(index) 

でReplaceAll(

String foo = "foofoo" //creates a string litteral, ref is saved to the stack 
String fooTwo = "foofoo" //fooTwo==foo returns true since both have same ref to the litteral 

私が作成したと私は将来refferencesを作るときかどうかを調べたりできるように、私が求めています:)、または他のlitteral作成などのようにスタックにリストから取得によって取得検索された文字列weather私は文字列全体を再作成しています。もし私がすでに作成したスタック上のlitteralへの言葉をつかんでいるのであれば、これらの文字列への将来のrefferencesは速くなります。より速いアクセスのために、各ステップでリテラルとしてローカルに文字列を使用しますか?

+1

なぜこれにコメントがないほど多くの下降音符がありますか? +1はドライブバイダウンダウンカウンタをオフセットします。 – Dan

+0

私はこれを+1して原因不明のdownvotesを相殺します。あなたの質問については、この質問の答えを読んでください:http://stackoverflow.com/questions/10759844/reusability-of-strings-in-java –

+0

また、Javaでは '=='と '=='を混同しないでください。 = 'Groovy(.equals())で宣言します。彼らは非常に異なっています。 –

答えて

0

生成されたバイトコードが定数プール、参照からスタックに追加される文字列を示す

// access flags 0x1 
    public run()Ljava/lang/Object; 
    L0 
    INVOKESTATIC script1467995483671.$getCallSiteArray()[Lorg/codehaus/groovy/runtime/callsite/CallSite; 
    ASTORE 1 
    L1 
    LINENUMBER 1 L1 
    ALOAD 1 
    LDC 1 
    AALOAD 
    LDC "string a" 
    LDC "" 
    INVOKEINTERFACE org/codehaus/groovy/runtime/callsite/CallSite.call (Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; 
    ARETURN 
    L2 
    ACONST_NULL 
    ARETURN 
    LOCALVARIABLE this Lscript1467995483671; L0 L2 0 
    MAXSTACK = 3 
    MAXLOCALS = 2 

ある

'string a'.replaceAll("") 

の出力を検査するグルービーコンソールのASTブラウザを使用 bytecode instructions

+0

私はコードをもう一度呼び出すと、このコードを再実行するのではなく、スタックからすでに格納されているlitteralを取得するか、毎回この処理を繰り返すのでしょうか? –

+0

同じ文字列を使用しますが、もちろんメモリにアクセスする必要がありますが、ガベージコレクションする必要がある新しいメモリやオブジェクトは割り当てられません。 –

関連する問題