String面试题--字符串的拼接

来源:互联网 发布:php学生管理系统源码 编辑:程序博客网 时间:2024/04/29 10:17

我们先看看下面的程序:

    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

0 0
原创粉丝点击