如果我有代码:
String s="a";
s="b";
请注意,这两个陈述之间没有s
的引用或使用。
java编译器会对此进行优化,忽略第一个赋值并仅在字符串池中存储“b"
”。
答案 0 :(得分:2)
我的期望如下:
可以使用以下代码进行测试:
public static void main(String[] args) throws Exception {
String a = new String(new char[] { 'a' }); //don't use string
String b = new String(new char[] { 'b' }); //literals or they
String c = new String(new char[] { 'c' }); //will be interned!
String s = "a";
s = "b";
System.out.println("a is interned? " + (a.intern() != a));
System.out.println("b is interned? " + (b.intern() != b));
System.out.println("c is interned? " + (c.intern() != c));
}
打印:
是实习生吗?真正
b是实习生?真正
c是实习生?假
正如所料。
但请注意,JIT编译器在启动时几乎肯定会删除未使用的语句,但这不会从池中删除字符串。