☞ 程序员进阶必备资源免费送「21种技术方向!」 ☜

粉丝福利:

专属优惠码4折优惠,当当网买书满400-230(点击查看)

前言

最近在突然想到了 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字符串拼接_字符串拼接,什么时候会走StringBuilder?相关推荐

  1. JAVA的MySQL字符串拼接_字符串的拼接-MYSQL

    SQL允许两个或者多个字段之间进行计算,字符串类型的字段也不例外.比如我们需要以"工号+姓名"的方式在报表中显示一个员工的信息,那么就需要把工号和姓名两个字符串类型的字段拼接计算: ...

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

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

  3. c++ 字符串拼接_源码上看 .NET 中 StringBuilder 拼接字符串的实现

    专注分享C/C++,Linux,golang技术,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,TCP/IP,协 ...

  4. Java学习笔记_字符串/静态static

    字符串的特点 字符串的内容永不可变 正是因为字符串不可改变,所以字符串是可以共享使用的 字符串效果上相当于是char[]字符数组,但是底层原理是byte[]字节数组 创建字符串的常见3+1种方式 三种 ...

  5. java string范围_字符串索引超出范围? (Java,子字符串循环...

    我正在为COSC课程制作的该程序编译不正确,但我不断收到错误消息: 线程"主"中的异常java.lang.StringIndexOutOfBoundsException:字符串索引 ...

  6. delphi 字符串占用空间_字符串在Python内部是如何省内存的

    起步 Python3 起,str 就采用了 Unicode 编码(注意这里并不是 utf8 编码,尽管 .py 文件默认编码是 utf8 ). 每个标准 Unicode 字符占用 4 个字节.这对于内 ...

  7. mongodb 字符串 截取_字符串截取

    字符串: 一:substr() substr() 方法可在字符串中抽取从 start 下标开始的指定数目的字符. stringObject.substr(start,length) 参数描述 star ...

  8. java对字符串归一化_字符串归一化

    5 import java.util.Scanner; public class Main{ public static void main(String[] args){ Scanner sc=ne ...

  9. java 反写_字符串反写(学习)

    今天想起了之前的一个问题,反写字符串的方法. 1. public class shouxie { public static void main(String[] args) { String str ...

最新文章

  1. java soap协议头_java – 服务器无法识别HTTP标头“SOAPAction”的值
  2. Java Web(11) Spring MVC 返回Json
  3. Eclipse调试Debug技巧
  4. Windows 技巧篇-设置我的漂亮桌面
  5. 图卷积神经网络_深度层次化图卷积神经网络
  6. 快速判断一个数是否是2的幂次方
  7. @dynamic 模拟NSManagedObject类的内部实现,AFN的非常规用法
  8. sql server序列_SQL Server中的序列对象
  9. h3c,nat网络地址转换
  10. 机器学习基础:评价指标(Machine Learning Fundamentals: Evaluation Metrics)
  11. 假设检验_关于假设检验与P值的几点看法
  12. java类 uuid_Java常用类——UUID类
  13. OPenGL 学习笔记之 Assimp 知识
  14. android汤姆猫的实验报告,毕业设计(论文)-基于Android的会说话的汤姆猫的设计与实现.doc...
  15. eovs实训报告总结心得_实训报告心得体会范文大全
  16. LinuxC——指针
  17. 欧拉角、四元数与旋转
  18. 智慧城市的互联网云脑架构,7种城市神经反射弧的建设是重点
  19. dell笔记本耳机怎么设置_对戴尔系统上的耳机/麦克风插孔问题进行故障排除
  20. 数模第五次作业:自己实现斯皮尔曼相关系数

热门文章

  1. EL4.1配置文件管理浅谈(1)
  2. 字符串比较中NSNumericSearch选项的工作原理
  3. 题解 P3978 【[TJOI2015]概率论】
  4. Unity设置播放模式下始终先执行指定的场景
  5. 深入理解 RecyclerView 系列之一:ItemDecoration
  6. 如何用java实现使用电子邮件控制你的电脑
  7. 利用mysqldump 将一个表按条件导出数据
  8. 揭开网络编程常见API的面纱【下】
  9. 4月第1周回顾:微软向雅虎发最后通牒 头号***伏法
  10. 如何在重装SAV10.1/SCS3.1服务器后继续管理原来的客户端