Java中字符串相加和字符串常量相加区别

有一道这样的程序:

 1 public class TestStringDemo {
 2 
 3     public static void main(String[] args) {
 4 
 5         String s1 = "Programming";
 6         String s2 = new String("Programming");
 7         String s3 = "Program";
 8         String s4 = "ming";
 9         String s5 = "Program" + "ming";
10         String s6 = s3 + s4;
11         System.out.println(s1 == s2);
12         System.out.println(s1 == s5);
13         System.out.println(s1 == s6);
17 } 18 }

让自己跟着做一遍,加深印象.....

 

程序的输出:

false
true
false

第一个输出:false ,我们还可以理解;

第二输出:true,跟我们的结果不一样,为什么输出true,不是说好了吗?字符串的+操作其本质是new了StringBuilder对象进行append操作,拼接后调用toString()返回String对象?

我们可以用以下命令获得.class文件对应的JVM字节码指令

javap -c StringEqualTest.class

JVM字节码指令:

 

 第20~22行,我们通过对比知道,String s5 = "Program" + "ming";在被编译器优化成了String s5 = "Programming"; 

 也可以得出字符串常量相加,不会用到StringBuilder对象,有一点要注意的是:字符串常量和字符串是不同的概念,字符串常量储存于方法区,而字符串储存于堆(heap)。

 

第三个输出:false ;通过以上的分析,自然也就明白了为森马是false了

 我们来分析一下JVM字节码指令

  1. 第24行:使用new 了 StringBuider对象
  2. 第25行:进行StringBuider对象初始化
  3. 第26行:使用append() 方法拼接s3的内容
  4. 第27行:再使用append() 方法拼接s4的内容
  5. 第28行:最后调用toString() 返回String对象

 

总结:

  • 两个或者两个以上的字符串常量相加,在预编译的时候“+”会被优化,相当于把两个或者两个以上字符串常量自动合成一个字符串常量
  • 字符串的+操作其本质是new了StringBuilder对象进行append操作,拼接后调用toString()返回String对象  

 

posted @ 2018-09-06 18:07  Lollipop.Hsu  阅读(6403)  评论(1编辑  收藏  举报