繁体   English   中英

在编译时或运行时生成 Java 字符串

[英]Java String generation at compile time or runtime

鉴于此代码:

if(somecondition) {
    String one = "one";
    //print one;
}

只有在该条件为真时才会生成此字符串?

感谢任何帮助。

编辑:

使用字符串池,可以肯定地说,无论条件如何,字符串one都会被添加到池中。

那么,如果需要从对象解析变量,会发生什么?

说,

String hello = "Hello Mr " + user.firstName();

这将如何添加到字符串池中? 并且当它确实被添加到字符串池时,它不会正确地创建新的字符串文字(除非 user.firstName() 更改)。

该字符串在您键入时生成; 但是,为了让这个答案有意义,我们需要在应用程序的构建和启动过程中经历转换。

  1. 首先,您将其输入到*.java文件中。
  2. 然后编译器将其作为常量池条目的一部分复制到*.class文件中。
  3. 然后运行程序并请求类,这触发类加载器将文件从磁盘复制到 RAM,触发创建的对象元数据条目以将常量包装在常量池中。

因此,根据您对希望使用的“创建”类型的定义,可以在多个位置“创建”它。

现在,在您的第一个示例中,使用字符串时并未实现 String 对象,而是使用*.class文件时。 但是,在您输入方法之前,它不会被正在运行的程序引用。

最后,使用字符串池化,每次将要创建字符串时,都会搜索现有字符串池,如果找到匹配条目,则使用匹配条目而不是创建新字符串。 这以大量字符串搜索为代价减少了运行时中的字符串数量。

由于您的代码的详细信息,您有三个不同的字符串符合池化条件(“Hello Mr”, user.firstName()的值,以及将它们组合在一起的字符串)。 “你好先生”将与类加载合并(假设正在完成合并)。 user.firstName()的值会在最初创建返回值时发生。 生成的组合字符串将在分配之前(或来自池的引用,如果它已经存在于池中)被池化。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM