JVM-字符串拼接原理

  • 前置内容

    • java虚拟机栈

1.那些字符串会进入字符串常量池

  1. 直接写的字面量
  2. 字面量的拼接结果(注意:如果字符串拼接中有变量则结果不会进入字符串常量池)
  3. 调用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字符串拼接原理相关推荐

  1. C\C++\Java字符串拼接比较

    C\C++\Java字符串拼接比较: 昨天买好小米盒子,自己折腾了一会然后就教会老妈怎么玩,怎么看还珠格格之后,我闲来无事,突然想起了上次一个项目处理字符串遇到的性能问题,然后就仔细考虑了一下,越考虑 ...

  2. 最优雅的Java字符串拼接是哪种方式?

    title shortTitle category tag description head 最优雅的Java字符串拼接是哪种方式? Java字符串拼接 Java核心 数组&字符串 Java程 ...

  3. java字符串拼接常用方式

    方式一:+ "+",是java操作运算符比较常用的,也是简单直接的一种方式. String aa = "魅言倾馨";String bb = "子非我鱼 ...

  4. java 字符串拼接_JAVA字符串拼接常见方法汇总

    字符串的拼接,常使用到的大概有4种方式: 1.直接使用"+"号 2.使用String的concat方法 3.使用StringBuilder的append方法 4.使用StringB ...

  5. Java字符串拼接“+“

    Java字符串拼接"+" 当字符串之间使用 + 号拼接的时候,系统底层会自动创建一个StringBuilder对象,然后再调用其append方法完成拼接,拼接后,再调用其toStr ...

  6. java字符串与数字拼接_Java数字和字符串拼接原理及案例

    字符串拼接是我们在Java代码中比较经常要做的事情,就是把多个字符串拼接到一起.都知道,String 是 Java 中一个不可变的类,所以一旦被实例化就无法被修改. 注意细节 字符是char 类型,字 ...

  7. java字符串拼接_为什么阿里巴巴不建议在for循环中使用quot;+quot;进行字符串拼接...

    点击上方"Java专栏",选择"置顶或者星标" 第一时间阅读精彩文章! ☞ 程序员进阶必备资源免费送「21种技术方向!」 点击查看☜ 字符串,是 Java 中最 ...

  8. 【224期】Java 字符串拼接五种方法的性能比较分析,从执行100次到90万次?

    点击上方"Java精选",选择"设为星标" 别问别人为什么,多问自己凭什么! 下方有惊喜,留言必回,有问必答! 每天 08:15 更新文章,每天进步一点点... ...

  9. 关于java字符串拼接处理方法的总结

    1.加号+拼接 这个用法是最初学习当中最常用的方法.原来也一直在用. 后来有了代码规范,在log打印日志的地方,让使用模板形式的字符串拼接. 才因此引发的思考. 这种+连接的优缺点在哪. 优点:只是方 ...

最新文章

  1. Bag of Tricks for Efficient Text Classification论文阅读及实战
  2. NBT:宏基因组10X建库+雅典娜算法组装获得微生物高质量基因组
  3. linux文件 i节点结构,Linux 文件描述符 文件表项 i节点结构
  4. IntelliJ Idea 2020.1 正式发布,官方支持中文了
  5. jstl sql标签使用
  6. 将信息写入TXT文本中(java)
  7. docker安装教程(windows和linux[centos8])
  8. 黑苹果关机重启后蓝牙连接不上_手机要关机吗,要贴膜吗,要套壳吗?看完这条,都有答案了_政务_澎湃新闻...
  9. 网络编程练习 -- NSURLConnection -- get/post请求
  10. CodeForces - 78E Evacuation(最大流)
  11. OncePerRequestFilter的作用
  12. React Native 从入门到原理
  13. 【20161108】总结
  14. 未来的计算机想象,关于未来电脑的想象作文
  15. python字典添加主键_字典的常见操作
  16. centos误删除恢复
  17. Table is marked as crashed and should be repaire (
  18. 如何让jar包显示Java图标
  19. java lambda表达式 list转string
  20. HTML+CSS+JavaScript+JQuery

热门文章

  1. Mybatis多对一一对多实现
  2. 如果你访问了某个网站,又不想让人知道怎么办?
  3. 索尼耳机适合android设备,安卓8.0的福音 解读索尼LDAC背后的故事
  4. 噢易云 python开发工程师 一二面
  5. hlookup函数使用教程_星期五的Excel函数:HLOOKUP查找当前价格
  6. mysql三台高可用_Mysql高可用,实现方案
  7. unity3d实现第一人称射击游戏之CS反恐精英(三)(人物旋转限制和跳跃功能(消除连跳,碰撞消除,高度稳定))
  8. 网店门面怎样运用RPA虚拟员工提高受理效率
  9. table添加实线的边框线
  10. 解决Fiddler、Charles抓包iOS系统手机无法连接网络问题