前言

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

一.问题

案例1

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

案例2

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

二.探究问题

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

可以看到在案例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;

作者:叫我不矜持

www.jianshu.com/p/a80c9b2b89cd

往期推荐

CTO说:Service层的接口是不是多此一举?

深入 Redis 主从复制的原理详解,权威又科学

不是每个打工人都能享受 996 的福报

阅读原文: 最新 3625页大厂面试题 

service 层 拼接的html 代码如何直接返回_字符串拼接,会走StringBuilder 吗?相关推荐

  1. service 层 拼接的html 代码如何直接返回_代码分层的设计之道

    分层思想,是应用系统最常见的一种架构模式,我们会将系统横向切割,根据业务职责划分.MVC 三层架构就是非常典型架构模式,划分的目的是规划软件系统的逻辑结构便于开发维护.MVC:英文即 Model-Vi ...

  2. service 层 拼接的html 代码如何直接返回_软件系统的分层,有效降低层与层之间的依赖...

    在分解复杂的软件系统时,架构师和程序员用得最多的技术之一就是分层.个人学习开发的时候,软件系统大多数是三层架构,也就是大家非常熟悉的表现层.领域层(业务层).数据源层.随着互联网的发展,智能手机普及手 ...

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

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

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

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

  5. c# 拼接字符串数组_C#_字符串拼接_浅

    测试环境:Unity2018.4:.Net4.x.需要注意.Net4.x和3.5差异还是挺大的 写的内容大部分网上已有,算是总结他人的成果,是浅谈. 1.先说几条结论: 1_1.字符串在C#中是高频出 ...

  6. 拼接的option会多出空行_液晶拼接屏与墙面安装技巧

    在安装液晶拼接屏时,往往我们会根据具体的安装环境推荐适合的安装方式,比如壁挂式.机柜式.焊接支架.双层铝型材等,每种安装方式也都有它的特点及要求,比如壁挂式最好在9块屏以下,以方便后期拆卸和维护,机柜 ...

  7. C语言_字符串拼接函数strcat使用及实现

    字符串拼接函数strcat 01--字符串拼接函数strcat函数原型 char* strcat(char *dest, const char *src); 作用:把src所指向的字符串(包括&quo ...

  8. js字符串如何拼接java代码_JS如何定义用字符串拼接的变量

    今天在写js的时候碰到了难题,我又一个页面需要生成很多的变量.但是变量的名称是根据参数的不同而区分的. 例如可能需要生成 date_1,date_2,datet_3... (后面的数字是根据参数来的) ...

  9. 常用的函数式接口_Consumer接口练习_字符串拼接输出

    练习:格式化打印信息 题目 下面的字符串数组当中存有多条信息,请按照格式" 姓名:XX.性别:XX."的格式将信息打印出来.要求将打印姓名的动作作为第一个Consumer 接口的L ...

最新文章

  1. (原創) 如何將CMOS所擷取的影像傳到PC端? (SOC) (DE2) (TRDB-DC2)
  2. windows下启动/关闭Sybase数据库服务器
  3. Android 拍照是开启(调用)闪光灯(原创)
  4. 面试官:String的最大长度是多少?
  5. Spring容器中导入组件方式
  6. 挑选SaaS企业需要注意十要素
  7. 奥托尼克斯接近开关型号_萨科微SLKOR的MOS 场效应管应用范围和型号
  8. svn切换分支 如何判断 是否完成_SVN创建分支/合并分支/切换分支
  9. 国内高速前端 Unpkg CDN 替代方案
  10. elemnt的Table 表格使用注意事项
  11. ubuntu源列表(清华,阿里,官方,选一即可)
  12. 2021年CBA总决赛第二场预测
  13. 豪横C4D电商实用素材,从此横着走
  14. U盘安装ubuntu server 10.4
  15. wordpress上传文件报错的解决方法(413 Request Entity Too Large、超过upload_max_filesize文件中定义的php.ini值)
  16. 26.逻辑卷管理器(Logical Volume Manager)
  17. sql语句ding_在postgresql中结束掉正在执行的SQL语句操作
  18. J-Link RTT Viewer 的各种不爽以及解决方案
  19. 问卷与量表数据分析(SPSS+AMOS)学习笔记(二) :问卷设计的原则与注意事项
  20. SysML实践指南第二版(中文翻译:刘亚龙)第七章 使用模块图(BDD)建模

热门文章

  1. BZOJ 4819: [Sdoi2017]新生舞会
  2. 牛客16464 神奇的幻方
  3. 计算机网络(二十六)-IP数据报分片
  4. idea中每次push/pull都需要输入账号密码
  5. 【剑指offer】面试题07. 重建二叉树(Java)
  6. oracle常见单词_Oracle中常见的英语单词
  7. 西门子plm_好事连连 西门子PLM新品多项合作并举
  8. xlwings 合并单元格 读取_xlwings,让excel飞起来
  9. Detected call of `lr_scheduler.step()` before `optimizer.step()`.
  10. 使用matplotlib画图时不能同时打开太多张图