如果有不正确的,欢迎指正。
String,StringBuilder,StringBuffer源码分析
上面这篇是之前写的关于 String 的一些介绍,有兴趣可以看下。
今天重新翻看 《Effective Java》这本书的时候,看到第五条:避免创建不必要的对象。文中是以 String s = new String(“stringette”); 拿来举例的。看到这里,就想起以前看一些面经中看到的一个问题,对于上面的的语句,在运行时涉及几个String实例?
对于上面的答案: 两个,一个是字符串 “abc” 锁在常量池中的实例,另一个是通过 new String(String) 创建并初始化、内容与 “abc” 相同的实例。
但是对下面的代码:
public class StringDemo {
public static void main(String[] args) {
String s1 = "abc";
String s = new String("abc");
System.out.println(s == s1);
}
}
字节码 ldc:将常量值从常量池中取出压入栈中。
通过查看上面代码的字节码的第0行和第7行可以看出,该字符串变量的值已经确定了,并没有重新创建一个变量,而是从缓冲区中取出,同时让该变量指向该字符串值。