专栏首页挨踢小子部落阁通过字节码,你才能真的读懂String,

通过字节码,你才能真的读懂String,

最近在突然想到了 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;

本文分享自微信公众号 - 挨踢小子(LN-aitixiaozi)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-10-27

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • String"+"拼接底层实现原理

    String:常量,不可变,不适合用来字符串拼接,每次都是新创建的对象,消耗较大。 StringBuffer:适合用来作字符串拼接 StringBuilder:...

    挨踢小子部落阁
  • 后端码农,46道常考Linux面试题(含答案)

    绝对路径用什么符号表示?当前目录、上层目录用什么表示?主目录用什么表示? 切换目录用什么命令?

    挨踢小子部落阁
  • 全面理解Javascript闭包和闭包的几种写法及用途

    好久没有写博客了,过了一个十一长假都变懒了,今天总算是恢复状态了。好了,进入正题,今天来说一说javascript里面的闭包吧!本篇博客主要讲一些实用的东西,...

    挨踢小子部落阁
  • 字符串拼接,什么时候会走StringBuilder?

    最近在突然想到了 String 字符串拼接问题,于是做了一个 demo 测试了一下,到底 String 类型的字符串在拼接的时候,哪种情况下会走会走 Strin...

    java思维导图
  • RabbitMQ学习之Routing(4)

    这节,我们讲订阅其中的一个子集。例如,我们想可以把危机的error message导到log file。而仍然可以打印所有的log messages到控制台。

    Vincent-yuan
  • 如何使用线程锁来提高多线程并发效率

           今天对synchronized关键字的用法又有了更高一层的理解,特此记录一下。        一直对自己设计的多通道做单不是狠满意,并发效率低下。...

    赵小忠
  • python绘图 | 多种台风路径可视化实现方法

    中国气象局(CMA)的台风最佳路径数据集(BST),BST是之后对历史台风路径进行校正后发布的,其经纬度、强度、气压具有更高的可靠性,但是时间分辨率为6小时,部...

    郭好奇同学
  • win10 uwp 进度条 WaveProgressControl

    昨天看到了有个大神做出好看的进度条样式,于是我就去抄袭他的代码,但是发现看不懂,于是本文主要翻译就是大神说这个控件如何做。

    林德熙
  • Canvas线条动画

     简单的Canvas动画,代码只有71行,试试吧!没有谁天生就会,用这个动画,做为你的Canvas小结。  如果你觉得我的代码还算有趣,在你的学习中能有所帮助,...

    我不是费圆
  • python绘图 | 多种台风路径可视化实现方法

    台风是重大灾害性天气,台风引起的直接灾害通常由三方面造成,狂风、暴雨、风暴潮,除此以外台风的这些灾害极易诱发城市内涝、房屋倒塌、山洪、泥石流等次生灾害。正因如此...

    气象学家

扫码关注云+社区

领取腾讯云代金券