2016-07-07 47 views
-2

我已经看过这个答案,我倾向于认为答案是肯定的:从列表中检索并创建字符串会在堆栈上创建litteral?

我正在创建一个迷你应用程序来帮助进行静态代码分析。为了让它运行得尽可能快,我需要了解使用groovy/java的语言Im如何处理这些字符串。我遇到的问题是了解天气代码:

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

line.get(index) 
中,如果在比较中使用和while语句将保存由Pattern.matcher()创建的字符串时

的replaceAll( )或从列表中检索到堆栈中检索在其他litteral创作,如:

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 

我问,这样我可能会或看看,当我使今后参考文献的到创建检索到的字符串天气我重新创建字符串完全或如果我只是抓住参考堆栈上,我已经作出的refteral,以便将来这些相同的字符串的refference会更快,或者如果我会更好地保存在每个步骤中将本地字符串串起来以便更快地访问?

+1

为什么有这么多downvotes没有评论?? +1来抵消驱动的downvoters。 – Dan

+0

我也会+1这抵消不明原因的downvotes。至于你的问题,通读这个问题的答案:http://stackoverflow.com/questions/10759844/reusability-of-strings-in-java –

+0

另外,不要混淆在Java和'= = ='in Groovy(.equals())。他们是非常不同的。 –

回答

0

使用常规控制台的AST浏览器检查的

'string a'.replaceAll("") 

输出所生成的字节码是

// 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 

其示出了字符串被添加到从常量池中堆叠,见 bytecode instructions

+0

因此,当我再次调用代码时,它不会重新执行此代码,而是从堆栈中抓取已存储的文件,或者每次都会重复执行此过程? –

+0

它会使用相同的字符串,当然内存需要被访问,但它不会分配任何需要垃圾收集的新内存或对象。 –