网站首页 > java教程 正文
作者:叫我不矜持
来源:https://url.cn/5qv5LOT
最近在突然想到了String字符串拼接问题,于是做了一个demo测试了一下,到底String类型的字符串在拼接的时候,哪种情况下会走会走StringBulider进行字符串拼接,而哪种情况编译器会对代码进行优化?话不多说,先看demo
问题
案例1
可以发现,str == str2的结果为false,那么我们在看看下一个例子。
案例2
这时候,两个字符串对比的结果为true。
探究问题
这时候,疑问就来了,为什么结果会不一致呢?利用在cmd窗口输入 javap-cTestDemo.class命令,对字节码文件进行反编译,发现了问题所在?
可以看到在案例1中,java代码底层走了StringBuilder,进行字符串拼接,然后调用了StringBuilder的toString方法。
而案例2中,对class文件进行反编译,发现代码出现了一点变化,并没有走StringBuilder进行字符串拼接。
总结
- 案例1中,通过变量和字符串拼接,java是需要先到内存找变量对应的值,才能进行完成字符串拼接的工作,这种方式java编译器没法优化,只能走 StringBuilder进行拼接字符串,然后调用toString方法,当然返回的结果和常量池中的 111这个字符串的内存地址是不一样的,因此结果为false。
- 案例2中,直接在表达式里写值,java不用根据变量去内存里找对应的值,可以在编译的时候直接对这个表达式进行优化,优化后的表达式从 "111"+"" 直接变成了 "111" ,两个String类型的变量都指向了常量池的111字符串,因此结果为true;
我自己是一名从事了多年开发的Java老程序员,辞职目前在做自己的Java私人定制课程,今年年初我花了一个月整理了一份最适合2019年学习的Java学习干货,从最基础的JavaSE到Spring各种框架都有整理,送给每一位Java小伙伴,想要获取的可以关注我的头条号并在后台私信我:Java,即可免费获取。
猜你喜欢
- 2024-11-18 不要在 Python 中使用 "+" 来连接字符串
- 2024-11-18 深入理解java String
- 2024-11-18 java中char和String的关系 在Java中
- 2024-11-18 StringBuilder vs. StringBuffer:谁才是字符串界的扛把子?
- 2024-11-18 别在Python中使用“+”来连接字符串了,还有更好用的方法
- 2024-11-18 掌握 Java 字符串处理:String、StringBuffer 和 StringBuilder
- 2024-11-18 Java 从底层与接口实现了解String、StringBuffer、StringBuilder
- 2024-11-18 别在Python中用“+”连接字符串了!
- 2024-11-18 拼字符串还在用StringBuilder?还有更好的选择
- 2024-11-18 Java基础之字符串及——String
你 发表评论:
欢迎- 最近发表
-
- 搞趣网:我的世界全新皮肤包原始居民下载地址
- 我的世界拔刀剑MOD下载(我的世界拔刀剑mod下载国际版)
- 我的世界无正版账号的简单联机方法(非网易版,仅适用于局域网)
- 一些可以显著提高大型 Java 项目启动速度的尝试
- 常见的java敏感异常介绍(java 常见的异常)
- Java 开发者必看!三招实现外部 Jar 包动态加载(含热更新方案)
- Java JAR 启动内存参数配置指南:从基础设置到性能优化
- 对Spring MVC接口进行Mock测试(springmvc对外接口)
- 还在用策略模式解决 if-else?Map+函数式接口方法才是YYDS
- 干掉OpenFeign,SpringBoot 3.0 自带的 HTTP 客户端真香!
- 标签列表
-
- java反编译工具 (77)
- java反射 (57)
- java接口 (61)
- java随机数 (63)
- java7下载 (59)
- java数据结构 (61)
- java 三目运算符 (65)
- java对象转map (63)
- Java继承 (69)
- java字符串替换 (60)
- 快速排序java (59)
- java并发编程 (58)
- java api文档 (60)
- centos安装java (57)
- java调用webservice接口 (61)
- java深拷贝 (61)
- 工厂模式java (59)
- java代理模式 (59)
- java.lang (57)
- java连接mysql数据库 (67)
- java重载 (68)
- java 循环语句 (66)
- java反序列化 (58)
- java时间函数 (60)
- java是值传递还是引用传递 (62)
本文暂时没有评论,来添加一个吧(●'◡'●)