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

时间:2010-06-02 10:16:13

标签: 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());}
}
  1. 这些字符串何时创建?我假设在运行时发生异常时将创建字符串。字符串在运行时创建并显示。我的同伴告诉我,由于这些是常量字符串,因此只要类加载就会创建它们。这是对的吗?

  2. 收集字符串垃圾的时间是什么时候?他们是垃圾收集了吗?假设在程序生命周期中可能会多次调用相同的方法,只是缓存它们没有意义吗?

1 个答案:

答案 0 :(得分:6)

  1. 这些String实际上是常量String,并且将在类的常量池中,因此在加载类时将在JVM中实例化。使用+创建它们的事实并不重要,因为整个String仍然是一个常量表达式(即它与您编写"Hello Worldone""Hello Worldtwo"时完全相同) 。这些规则在JLS的§ 3.10.5 String Literals中描述。

  2. String对象被垃圾收集的方式与任何其他对象被垃圾收集的方式相同,这些对象没有任何本质上的不同。 然而 some String are interned(最值得注意的是,这包括所有字符串文字),这可能会或可能不会阻止它们被垃圾收集(未定义且与实现有关)。

    因此,只要您的类仍然加载,那些String常量将保持存在且不会被垃圾回收。