Java 常量字符串何时创建/销毁?

Java 常量字符串何时创建/销毁?,java,string,garbage-collection,Java,String,Garbage Collection,考虑以下代码 public static void method(String[] srgs){ try{ }catch(){ System.out.println("Hello World" + "one");} catch(..){ System.out.println("Hello World" + "two");} catch(..){ System.out.println(getString());} } 这些字符串是什么时候创建的?我假设字符串将在运行时发

考虑以下代码

public static void method(String[] srgs){  
try{  

}catch(){  
System.out.println("Hello World" + "one");}  
catch(..){  
System.out.println("Hello World" + "two");}
catch(..){  
System.out.println(getString());}
}
  • 这些字符串是什么时候创建的?我假设字符串将在运行时发生异常时创建。字符串在运行时创建并显示。我的一位同事告诉我,由于这些字符串是常量字符串,因此在类加载时,它们将被创建。对吗

  • 字符串何时被垃圾回收?它们是垃圾吗?假设同一个方法在程序生命周期中可能被多次调用,那么仅仅缓存它们就没有意义了吗

  • 这些字符串实际上是常量字符串,将位于类的常量池中,因此在加载类时将在JVM中实例化。它们是用
    +
    创建的这一事实并不重要,因为整个字符串仍然是一个常量表达式(即,它与您编写的
    “Hello Worldone”
    “Hello Worldtwo”
    完全相同)。这些规则在JLS的第页中进行了描述

  • String
    对象的垃圾收集方式与任何其他对象的垃圾收集方式相同,它们没有本质上的区别。但是(最值得注意的是,这包括所有字符串文字),这可能会也可能不会阻止它们被垃圾收集(未定义,并且依赖于实现)

    因此,只要类保持加载状态,这些字符串常量就会保持存在,并且不会被垃圾收集


  • 谢谢约阿希姆,考虑SOP(Hello World)+GETString()),在这种情况下,常数字符串仍然是创建的吗?执行此行时是否创建了第二个字符串?第二个字符串是否已收集垃圾?你能给我一个你回答第1点的来源吗?我链接了JLS的相关部分
    “HelloWorld”+getstr()
    不是
    字符串
    文本('尽管它包含一个:
    “HelloWorld”
    )。每次执行该行时都会生成一个新的
    String
    对象,并且该对象会被正常垃圾收集。@Joachimsuer“HelloWorld”+getstr()1的情况。加载该类时是否仍会创建“HelloWorld”?2.如果我们不想阻止字符串被垃圾收集,新字符串(“HelloWorld”)会有帮助吗?@Jaskey:1。是的,它仍将被创建,2。不,这不会有帮助,它只是创建了一个额外的(无用的)字符串实例(请注意,它仍然包含表达式
    “HelloWorld”
    !)。