考虑以下代码
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());}
}
这些字符串何时创建?我假设在运行时发生异常时将创建字符串。字符串在运行时创建并显示。我的同伴告诉我,由于这些是常量字符串,因此只要类加载就会创建它们。这是对的吗?
收集字符串垃圾的时间是什么时候?他们是垃圾收集了吗?假设在程序生命周期中可能会多次调用相同的方法,只是缓存它们没有意义吗?
答案 0 :(得分:6)
这些String实际上是常量String,并且将在类的常量池中,因此在加载类时将在JVM中实例化。使用+
创建它们的事实并不重要,因为整个String仍然是一个常量表达式(即它与您编写"Hello Worldone"
和"Hello Worldtwo"
时完全相同) 。这些规则在JLS的§ 3.10.5 String Literals中描述。
String
对象被垃圾收集的方式与任何其他对象被垃圾收集的方式相同,这些对象没有任何本质上的不同。 然而 some String are interned(最值得注意的是,这包括所有字符串文字),这可能会或可能不会阻止它们被垃圾收集(未定义且与实现有关)。
因此,只要您的类仍然加载,那些String常量将保持存在且不会被垃圾回收。