Demo1
String s1 = “a” + “b” + “c”;
String s2 = “abc”;
System.out.println(s1 == s2);
System.out.println(s1.equals(s2));
反编译(后):
String s1 = "abc";
String s2 = "abc";
System.out.println(s1 == s2);
System.out.println(s1.equals(s2));
Demo2
String s1 = “ab”;
String s2 = “abc”;
String s3 = s1 + “c”;
System.out.println(s3 == s2);
System.out.println(s3.equals(s2));
反编译(后):
String s1 = "ab";
String s2 = "abc";
String s3 = (new StringBuilder()).append(s1).append("c").toString();
System.out.println(s3 == s2);
System.out.println(s3.equals(s2));
分析:通过反编译可以明显看出,Demo1中字符串拼接时没有变量参与s1和s2对象地址完全相等(常量池中),而Demo2中JVM(java虚拟机)通过生成StringBuilder对象,拼接而成的字符串对象明显不是同一个地址(堆中)。