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

我们先看看下面的程序:

    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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值