我们先看看下面的程序:
String s1="hello";
String s2="world";
String s3="helloworld";
System.out.println(s3==s1+s2);
System.out.println(s3.equals(s1+s2));
System.out.println(s3=="hello"+"world");
System.out.println(s3.equals("hello"+"world"));
你看出来上面的结果了吗?
- 首先我们讲解一下,赋值字符串后的变量用+符号连接和直接用+符号连接两个字符串的区别。第一,s1和s2是赋值后在用+符号相连接在一起的,程序的执行步骤是,现在常量池里开辟字符串“hello”的空间,然后s1指向指向这片空间,接着是在常量池里开辟字符串“world”的空间,s2指向了这片空间。同理,s3也指向了在常量池里新开辟的字符串“helloworld”的那片空间,而==在比较引用数据类型的时候,是比较的地址是否相等,下面这行代码是
System.out.println(s3==s1+s2);
这行代码的反编译后的结果,可以看出,eclipse执行的底层是将s1和s2放入到了StringBuilder缓冲区里,然后在转为String类型的。所以第一条打印语句的结果是false。
System.out.println(s3==(newStringBuilder(String.valueOf(s1))).append(s2).toString());
equals比较的是内容是否相同,所以第二个和第四个打印的内容都是true。
最后分析
s3=="hello"+"world"
这句,这句在编译时,+符号直接将两个字符串合并为一个字符串,即“helloworld”。然后s3是直接指向了这片区域的。所以这个结果是true。
所以最终的结果就是
false
true
true
true