某天下午,松师傅在写他的 Jvav 作业,其中有一道题:

String s4 = "Wel" + "come";
String s5 = "Wel";
String s6 = "come";
String s7 = s5 + s6;

表达式 s4 == s7 的结果为?

答案是 false

这让松师傅摸不着头脑了,字符串 s4s7 这两种拼接方式有啥区别呢?

此时一位世外高人点拨他:

世外高人

原来使用 + 号拼接字符串时,编译器会进行优化,创建一个 StringBuilder 对象,然后调用 append 方法,最后调用 toString 方法,例如:

String jeremy = "Jeremy";
String tsai = "Tsai";
String jeremytsai = jeremy + tsai;

会被编译为:

String jeremytsai = new StringBuilder().append(jeremy).append(tsai).toString();

而对于字符串常量的拼接,编译器会直接进行优化,合并为一个完整的字符串,并在字符串常量池中查找是否已经存在拼接好的字符串,返回一个字符串常量池的地址:

String s = "Wel" + "come";

实际上是:

String s = "Welcome";

拓展

其他的字符串拼接方式: