Java程序员相必都知道或者应该需要知道String的值是存在一个叫字符串常量池的数据结构内的,如果常量池内有字符串“AA”,这是之前一次赋值字符串String b = “AA”
的时候产生的,那么你再写String a="AA"
的时候,并没有新生成一个字符串,而是a指向了常量池中的那个字符串,从而得到a==b为true的情况。假如String a = new String("AA")
则不是,同时String c = “A”+“A”
也是等价于a的。
以上是教科书的内容或者笔试题硬背的姑且不论,我们通过javap命令来实际感受下为什么会这样,关于javap命令的知识请参考这个博主的。
- 测试类内容
public class TTTT {
public static void main(String[] args) {
String ss = "sssssss";
String sss = "ss"+"sssss";
String ssss = new String("sssssss");
}
}
- 查看常量池(javap -verbose)
首先声明这不是查看常量池的命令,只是能看到常量池而已,截图如下
可以看到常量池中有个 #16是个字符串sssssss,也只存在这一个字符串。 - 查看类的字节码(javap -c)
可以看到0~2,3~5是一样的,指向同一个常量池中的字符串,另外6~10new出来的有new 、dup的步骤,具体意思请移步字节码指令列表