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

时间:2016-07-07 14:30:55

标签: java string list groovy stack

我已经全神贯注地寻找这个答案了,我倾向于认为答案是肯定的:

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

res1 %>% group_by(Age_Group = age_group) %>%
summarise(Count = n_distinct(ID))

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

当在if和while语句的比较中使用时,将保存由Pattern.matcher()。replaceAll()创建的字符串,或者从列表中检索到的堆栈,如在其他文本创建中那样:

line.get(index)

我正在询问,以便我可以查看当我将来对已创建或检索到的字符串进行反馈时,我是否完全重新创建字符串,或者如果我只是抓住对已经制作的堆栈上的litteral的引用以便将来对这些相同字符串的引用会更快,或者如果我最好将本地字符串保存为每个步骤的litterals以便更快地访问?

1 个答案:

答案 0 :(得分:0)

使用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

显示从常量池添加到堆栈的字符串,请参阅 bytecode instructions