看了最近几个String系列的小伙伴可能会很纳闷,这么简单的东西有必要写一篇博客吗?是不是有点浪费感情?
然而并不会,平心而论,看完代码秒出结果,并且是正确的结果,必须要有深厚的JavaSE功底,这样的人,不多。
今天我们通过7行代码分析一道关于String拼接的经典面试题。
请先看代码:
<span style="white-space:pre"> </span>String s11 = "Hello";
String s12 = "World";
String s13 = "HelloWorld";
System.out.println(s13 == s11 + s12);
System.out.println(s13.equals(s11 + s12));
System.out.println(s13 == "Hello" + "World");
System.out.println(s13.equals("Hello" + "World"));
false true true true,
为啥是这个鬼?
有了最近几个String系列的基础,我们脑补内存图,然后开始分析:
牢记:
字符串变量相加,先开空间再拼接。
字符串常量相加,先拼接,再常量池找,有则直接返回,否则创建。
因此1-false,3-true。
正所谓实践出真知,我们用反编译工具验证一下:
<span style="white-space:pre"> </span>System.out.println(s13 == (new StringBuilder(String.valueOf(s11))).append(s12).toString());
System.out.println(s13.equals((new StringBuilder(String.valueOf(s11))).append(s12).toString()));
System.out.println(s13 == "HelloWorld");
System.out.println(s13.equals("HelloWorld"));