Java 从列表中检索和创建字符串会在堆栈上创建Literal?

Java 从列表中检索和创建字符串会在堆栈上创建Literal?,java,string,list,groovy,stack,Java,String,List,Groovy,Stack,我到处寻找这个答案,我倾向于认为答案是肯定的: 我正在创建一个迷你应用程序来帮助静态代码分析。为了使它尽可能快地运行,我需要了解我使用groovy/java的语言将如何处理这些字符串。我遇到的问题是理解代码: space.matcher(line.get(index)).replaceAll("") 或 当在if和while语句中用于比较时,会将由Pattern.matcher().replaceAll()创建的字符串或由retrieve from列表检索的字符串保存到堆栈中,就像在其他临时创

我到处寻找这个答案,我倾向于认为答案是肯定的:

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

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

当在if和while语句中用于比较时,会将由Pattern.matcher().replaceAll()创建的字符串或由retrieve from列表检索的字符串保存到堆栈中,就像在其他临时创建中一样,例如:

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

我这样问是为了弄清楚,当我以后对创建或检索的字符串进行引用时,我是在完全重新创建字符串,还是只是在堆栈上抓取对已创建字符串的引用,以便将来对这些相同字符串的引用会更快,或者,我是否最好在每一步都将字符串作为垃圾保存在本地,以便更快地访问

使用groovy控制台的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
其中显示了从常量池添加到堆栈的字符串,请参见

为什么有这么多人投了反对票却没有评论+1来抵消下行投票人的推动。我也将+1来抵消无法解释的下行投票。至于您的问题,请通读此问题的答案:另外,不要混淆Java中的
=
和Groovy(.equals())中的
=
。谢谢你的投票,我也很困惑,我的问题是合理的@JonPeterson感谢您最近转向groovy感谢您指出了相等的绝望,我不知道这是java基于引用的比较对语言所做的更改。@JonPeterson感谢您提供的链接,但不幸的是,这不是我真正想要的,我知道他们称之为“pool”的字符串和关于interning,我想通过调用我在问题中发布的方法来了解天气情况,如果返回的字符串是自动插入的。因此,当我再次调用代码时,它不会重新执行此代码,而是从堆栈中获取已存储的字符串,还是会每次重复此过程?它将使用相同的字符串,当然,需要访问内存,但它不会分配任何需要进行垃圾收集的新内存或对象。
  // 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