java何时创建/销毁常量字符串?
考虑下面的代码
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 楼答案
这些字符串实际上是常量字符串,将位于类的常量池中,因此在加载类时将在JVM中实例化。它们是用
+
创建的这一事实并不重要,因为整个字符串仍然是一个常量表达式(即,它将与您编写"Hello Worldone"
和"Hello Worldtwo"
时完全相同)。这些规则在JLS的§ 3.10.5 String Literals中描述String
对象被垃圾收集的方式与任何其他对象被垃圾收集的方式相同,它们本身没有什么不同然而,some String are interned(最明显的是,这包括所有字符串文本),这可能会或可能不会阻止它们被垃圾收集(这没有定义,并且依赖于实现)因此,只要类保持加载状态,这些字符串常量就会保持存在,并且不会被垃圾收集