引申:一个常见的String的面试题

public static void main(String[] args) {
// TODO Auto-generated method stub
String s1 = "Hello";
String s2 = "World";
String s3 = "Hello"+"World";
String s4 = s1+s2;
String s5 = "HelloWorld"; System.out.println(s3==s5);//true
System.out.println(s3.equals(s5));//true
System.out.println(s4==s5);//false
System.out.println(s4.equals(s5));//true }

这里我们发现同样是使用了+号运算符作为字符串的拼接,但是常量"Hello"+"World"和s1+s2的结果并不相同。

我们已经知道java在存储字符串的时候,字符串是常量;它们的值在创建之后不能更改。那么在栈中 s3 是指向了helloworld的方法区的,那么s1+s2如果没有开辟空间(一般开辟空间使用的new,但是这里并没有进行new)应该也是指向了helloworld方法区的,值应该是一样的才对,那怎么会出现2种不同的情况。

实际上,在jdk文档中已经说明了这种情况

java 语言提供对字符串串联符号("+")以及将其他对象转换为字符串的特殊支持。字符串串联是通过 StringBuilder(或 StringBuffer)类及其 append 方法实现的。字符串转换是通过 toString 方法实现的,该方法由 Object 类定义,并可被 Java 中的所有类继承。

这里我们可以分析出其实 s1+s2是进行了new 一个StringBuilder来作为拼接的。那这样我们来反编译一下验证一下这个情况

使用Xjad反编译

这里我们看到了两个常量作为拼接的时候,编译器已经做了一次合并,所以s5和s3一模一样,s4=s1+s2,这里是new了一个StringBuilder然后append字符串s2然后转为string的。这里明显是开辟了新的堆空间。所以s4不等于s5。

最新文章

  1. 【Win10应用开发】自适应磁贴中的分组
  2. jQuery触发a标签点击事件-为什么不跳转
  3. c# winform 全角自动转化半角问题(C#中ImeMode的值):转载
  4. (转)mvc Area相关技术
  5. cocos2d回忆
  6. tar 报错gzip: stdin: not in gzip format
  7. BZOJ 1502 月下柠檬树(simpson积分)
  8. codeforces 434B B. Nanami's Digital Board(分治)
  9. 【递推】BZOJ 3930: [CQOI2015]选数
  10. JAVA线程优化
  11. 找到的两个php爬虫,分享一下
  12. 3.redis.3.2 下载,安装、配置、使用、集群主从创建 - 3
  13. VLD 1.0 ReadMe翻译尝试
  14. SAP HANA studio 创建分析视图
  15. 【G彩娱乐网】作为一名程序员,我应该如何选购一台电脑?
  16. json格式处理及扩展
  17. LeetCode--028--实现strStr() (java)
  18. Verilog实现模长等于六十的二进制编码计数器
  19. 2554 ACM 杭电 数学
  20. GO注释

热门文章

  1. js高级-模块化演变
  2. Halcon常用算子01
  3. 函数式编程语言(Functional Program Language)
  4. 对于“2017面向对象程序设计(Java)第三周学习总结”存在问题的反馈
  5. WPF双向绑定
  6. bpm 学习笔记一
  7. java搭建web从0-1(第一步:创建web工程)
  8. 彻底弄懂css中单位px和em,rem的区别
  9. Linux服务器安装配置Nginx服务器
  10. Python delattr() 函数