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());}
}
+
创建的这一事实并不重要,因为整个字符串仍然是一个常量表达式(即,它与您编写的“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”
!)。