作者:叫我不矜持

www.jianshu.com/p/a80c9b2b89cd

前言

最近在突然想到了String字符串拼接问题,于是做了一个demo测试了一下,到底String类型的字符串在拼接的时候,哪种情况下会走会走StringBulider进行字符串拼接,而哪种情况编译器会对代码进行优化?话不多说,先看demo

一.问题

案例1

测试代码1.png

可以发现,str == str2的结果为false,那么我们在看看下一个例子。

案例2

测试代码2.png

这时候,两个字符串对比的结果为true。

二.探究问题

这时候,疑问就来了,为什么结果会不一致呢?利用在cmd窗口输入javap -c TestDemo.class命令,对字节码文件进行反编译,发现了问题所在?

测试代码1cmd.png

可以看到在案例1中,java代码底层走了StringBuilder,进行字符串拼接,然后调用了StringBuilder的toString方法。

测试代码2cmd.png

而案例2中,对class文件进行反编译,发现代码出现了一点变化,并没有走StringBuilder进行字符串拼接。

三.总结

1、案例1中,通过变量和字符串拼接,java是需要先到内存找变量对应的值,才能进行完成字符串拼接的工作,这种方式java编译器没法优化,只能走StringBuilder进行拼接字符串,然后调用toString方法,当然返回的结果和常量池中的111这个字符串的内存地址是不一样的,因此结果为false。

2、案例2中,直接在表达式里写值,java不用根据变量去内存里找对应的值,可以在编译的时候直接对这个表达式进行优化,优化后的表达式从 "111" + "" 直接变成了 "111" ,两个String类型的变量都指向了常量池的111字符串,因此结果为true;

精彩推荐

一百期Java面试题汇总

SpringBoot内容聚合

IntelliJ IDEA内容聚合

Mybatis内容聚合

END

我知道你 “在看”

字符串拼接,什么时候会走StringBuilder?相关推荐

  1. 面试:字符串拼接,什么时候用StringBuilder?

    点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 来源 | www.jianshu.com/p/a80c9 ...

  2. service 层 拼接的html 代码如何直接返回_字符串拼接,会走StringBuilder 吗?

    前言 最近在突然想到了String字符串拼接问题,于是做了一个demo测试了一下,到底String类型的字符串在拼接的时候,哪种情况下会走会走StringBulider进行字符串拼接,而哪种情况编译器 ...

  3. java字符串拼接_字符串拼接,什么时候会走StringBuilder?

    ☞ 程序员进阶必备资源免费送「21种技术方向!」 ☜ 粉丝福利: 专属优惠码4折优惠,当当网买书满400-230(点击查看) 前言 最近在突然想到了 String 字符串拼接问题,于是做了一个 dem ...

  4. java 创建string对象机制 字符串缓冲池 字符串拼接机制 字符串中intern()方法...

    字符串常量池:字符串常量池在方法区中 为了优化空间,为了减少在JVM中创建的字符串的数量,字符串类维护了一个字符串池,每当代码创建字符串常量时,JVM会首先检查字符串常量池.如果字符串已经存在池中,就 ...

  5. java 循环拼接字符串用分号隔开_Java 8中字符串拼接新姿势:StringJoiner

    在为什么阿里巴巴不建议在for循环中使用"+"进行字符串拼接一文中,我们介绍了几种Java中字符串拼接的方式,以及优缺点.其中还有一个重要的拼接方式我没有介绍,那就是Java 8中 ...

  6. c++ 字符串拼接_字符串拼接新姿势:StringJoiner

    来自:Hollis(微信号:hollischuang) 在为什么阿里巴巴不建议在for循环中使用"+"进行字符串拼接一文中,我们介绍了几种Java中字符串拼接的方式,以及优缺点.其 ...

  7. Java 8中字符串拼接新姿势:StringJoiner

    在为什么阿里巴巴不建议在for循环中使用"+"进行字符串拼接一文中,我们介绍了几种Java中字符串拼接的方式,以及优缺点.其中还有一个重要的拼接方式我没有介绍,那就是Java 8中 ...

  8. java 创建string对象机制 字符串缓冲池 字符串拼接机制

    对于创建String对象的机制,在这一过程中涉及的东西还是值得探究一番的. 首先看通过new String对象和直接赋值的方式有什么区别,看如下代码: public static void main( ...

  9. java 字符串拼接_JAVA字符串拼接常见方法汇总

    字符串的拼接,常使用到的大概有4种方式: 1.直接使用"+"号 2.使用String的concat方法 3.使用StringBuilder的append方法 4.使用StringB ...

最新文章

  1. apue.h头文件(UNIX环境高级编程)
  2. Generating RSA keys in PKCS#1 format in Java--转
  3. 在Servlet中向客户端写Cookie信息
  4. 新浪短网址生成java_如何生成t.cn的短链接?新浪短网址怎么生成的?
  5. 规则引擎:大厂营销系统资格设计全解
  6. python接口测试jason_Python 接口测试之Json数据文件操作
  7. 凯撒密码pythin密码_凯撒密码术
  8. Leetcode算法题(C语言)11--有效的数独
  9. Flex通过Java读取Excel(详细流程)----Excel在客户端(DataGrid动态根据Excel生成)
  10. 25. Location hash 属性
  11. [2018.07.12 T2] B君的第二题
  12. SWMM代码移植到64位平台
  13. 青年志愿者演讲稿范⽂5篇
  14. linux文件系统程序设计实验报告,浙江大学Linux程序设计实验报告
  15. 磁流体和两相磁流体的无条件能量稳定解耦算法
  16. vue常用之“定义全局变量constants”
  17. 1.1 嵌入式系统的定义和组成
  18. 【踩坑】RTX30系列显卡的CUDA配置
  19. 删除/清除/过滤标点(所有中英文标点)的正则表达式——Desktop Search开发笔记【经验积累】
  20. iOS主题更换、音乐播放器、栏目管理、上传视频封面等源码

热门文章

  1. 淘宝、京东等下架火箭队相关商品,回应:涉及主权问题没有讨价还价余地
  2. 小米MIX 4概念渲染图曝光:无孔屏下摄像头果真科幻
  3. 快手副总裁林粼:快手将从事5G相关业务线研究布局
  4. 三星Galaxy Fold入网:屏幕故障+数次跳票 热度还有多少?
  5. 荣耀20发布会花式官宣:4!-3!+2!伦敦见
  6. 常用的sql语句用法
  7. c语言实现队列基本算法,【算法】队列的C语言实现
  8. java如何检测输入合法_使用java写的一个简易的计算器,可以检测输入是否合法。.doc...
  9. java中readline函数_自定义BufferedReader中read和readLine方法
  10. HTML实现选择数据库字段,django项目中在后台获取了数据库的某一列,如何将其显示在html模板中的select标签内的option选项下?...