Java字符串拼接原理
JVM-字符串拼接原理
- 前置内容
- java虚拟机栈
1.那些字符串会进入字符串常量池
- 直接写的字面量
- 字面量的拼接结果(注意:如果字符串拼接中有变量则结果不会进入字符串常量池)
- 调用String的intern方法可以将String存入字符串常量池
2. 字面量的拼接原理
java源码
package com.hgy;import java.util.Arrays; import java.util.List;public class hello {public static void main(String[] args) {String a = "hello" + " world";} }
在idea中查看编译后的class文件
// // Source code recreated from a .class file by IntelliJ IDEA // (powered by Fernflower decompiler) //package com.hgy;public class hello {public hello() {}public static void main(String[] args) {String a = "hello world";} }
结论:
- 以上面两个文件我们可以看出,这种字符串的拼接在编译期间就已经优化了,直接就合并为一个字符串;并且这个字符串存放在字符串常量池
3. 字符串和变量拼接原理
java源码
package com.hgy;import java.util.Arrays; import java.util.List;public class hello {public static void main(String[] args) {String v = "java";String a = v + "hello" + " world";} }
利用jclasslib查看main方法的字节码命令
- 如果一下名词不明白请阅读java虚拟机栈
- 我们可以发现就简单的两行代码,产生了这么多的字节码命令;在代码中我简单解释了每一行的作用,
0 ldc #2 <java> // 从字符串常量池加载java2 astore_1 // 存储常量到索引为1的局部变量表中3 new #3 <java/lang/StringBuilder> //给StringBuilder对象分配内存空间6 dup7 invokespecial #4 <java/lang/StringBuilder.<init>> //执行StringBuilder的构造方法 10 aload_1 //获取局部变量表索引为1的引用地址, 11 invokevirtual #5 <java/lang/StringBuilder.append> //把上面加载的内容作为参数传递给append方法 14 ldc #6 <hello world> // 从字符串常量池加载hello world 16 invokevirtual #5 <java/lang/StringBuilder.append> //把上面加载的内容作为参数传递给append方法 19 invokevirtual #7 <java/lang/StringBuilder.toString> //调用toString方法 22 astore_2 //结果存储到局部变量表 23 return
以上内容我们可以知道字符串拼接实际上就是创建了一个StringBuilder对象然后向里面append内容,最后调用toString方法获得结果
3.1 为什么结果没有存储在常量池
从上述字节码指令已经知道了字符串拼接结果是StringBuilder的toString方法的结果,那么toString里面具体做了什么事情,又是为什么结果不在常量池?
一下是StringBuilder.toString的源码以及字节码指令
@Overridepublic String toString() {// Create a copy, don't share the array//此处value为一个char数组【我的jdk版本为jdk8】return new String(value, 0, count);}
0 new #80 <java/lang/String>3 dup4 aload_05 getfield #234 <java/lang/StringBuilder.value>8 iconst_09 aload_0 10 getfield #233 <java/lang/StringBuilder.count> 13 invokespecial #291 <java/lang/String.<init>> 16 areturn
以上代码可以很好的解释实际上最终是调用了String的构造方法传入一个char数组,那么最终的结果肯定也就在咱么的堆空间
Java字符串拼接原理相关推荐
- C\C++\Java字符串拼接比较
C\C++\Java字符串拼接比较: 昨天买好小米盒子,自己折腾了一会然后就教会老妈怎么玩,怎么看还珠格格之后,我闲来无事,突然想起了上次一个项目处理字符串遇到的性能问题,然后就仔细考虑了一下,越考虑 ...
- 最优雅的Java字符串拼接是哪种方式?
title shortTitle category tag description head 最优雅的Java字符串拼接是哪种方式? Java字符串拼接 Java核心 数组&字符串 Java程 ...
- java字符串拼接常用方式
方式一:+ "+",是java操作运算符比较常用的,也是简单直接的一种方式. String aa = "魅言倾馨";String bb = "子非我鱼 ...
- java 字符串拼接_JAVA字符串拼接常见方法汇总
字符串的拼接,常使用到的大概有4种方式: 1.直接使用"+"号 2.使用String的concat方法 3.使用StringBuilder的append方法 4.使用StringB ...
- Java字符串拼接“+“
Java字符串拼接"+" 当字符串之间使用 + 号拼接的时候,系统底层会自动创建一个StringBuilder对象,然后再调用其append方法完成拼接,拼接后,再调用其toStr ...
- java字符串与数字拼接_Java数字和字符串拼接原理及案例
字符串拼接是我们在Java代码中比较经常要做的事情,就是把多个字符串拼接到一起.都知道,String 是 Java 中一个不可变的类,所以一旦被实例化就无法被修改. 注意细节 字符是char 类型,字 ...
- java字符串拼接_为什么阿里巴巴不建议在for循环中使用quot;+quot;进行字符串拼接...
点击上方"Java专栏",选择"置顶或者星标" 第一时间阅读精彩文章! ☞ 程序员进阶必备资源免费送「21种技术方向!」 点击查看☜ 字符串,是 Java 中最 ...
- 【224期】Java 字符串拼接五种方法的性能比较分析,从执行100次到90万次?
点击上方"Java精选",选择"设为星标" 别问别人为什么,多问自己凭什么! 下方有惊喜,留言必回,有问必答! 每天 08:15 更新文章,每天进步一点点... ...
- 关于java字符串拼接处理方法的总结
1.加号+拼接 这个用法是最初学习当中最常用的方法.原来也一直在用. 后来有了代码规范,在log打印日志的地方,让使用模板形式的字符串拼接. 才因此引发的思考. 这种+连接的优缺点在哪. 优点:只是方 ...
最新文章
- Bag of Tricks for Efficient Text Classification论文阅读及实战
- NBT:宏基因组10X建库+雅典娜算法组装获得微生物高质量基因组
- linux文件 i节点结构,Linux 文件描述符 文件表项 i节点结构
- IntelliJ Idea 2020.1 正式发布,官方支持中文了
- jstl sql标签使用
- 将信息写入TXT文本中(java)
- docker安装教程(windows和linux[centos8])
- 黑苹果关机重启后蓝牙连接不上_手机要关机吗,要贴膜吗,要套壳吗?看完这条,都有答案了_政务_澎湃新闻...
- 网络编程练习 -- NSURLConnection -- get/post请求
- CodeForces - 78E Evacuation(最大流)
- OncePerRequestFilter的作用
- React Native 从入门到原理
- 【20161108】总结
- 未来的计算机想象,关于未来电脑的想象作文
- python字典添加主键_字典的常见操作
- centos误删除恢复
- Table is marked as crashed and should be repaire (
- 如何让jar包显示Java图标
- java lambda表达式 list转string
- HTML+CSS+JavaScript+JQuery
热门文章
- Mybatis多对一一对多实现
- 如果你访问了某个网站,又不想让人知道怎么办?
- 索尼耳机适合android设备,安卓8.0的福音 解读索尼LDAC背后的故事
- 噢易云 python开发工程师 一二面
- hlookup函数使用教程_星期五的Excel函数:HLOOKUP查找当前价格
- mysql三台高可用_Mysql高可用,实现方案
- unity3d实现第一人称射击游戏之CS反恐精英(三)(人物旋转限制和跳跃功能(消除连跳,碰撞消除,高度稳定))
- 网店门面怎样运用RPA虚拟员工提高受理效率
- table添加实线的边框线
- 解决Fiddler、Charles抓包iOS系统手机无法连接网络问题