2301_76940034 2024-02-15 01:25 采纳率: 23.5%
浏览 6
已结题

JDK8字符串拼接的底层原理

JDK8字符串拼接的底层原理

img


不是会先预估它最终的字符串长度并创建一个数组吗?
这个数组是什么数组,字符数组还是字节数组,有没有方法看它创建的是什么数组

  • 写回答

3条回答 默认 最新

  • 专家-郭老师 Java领域新星创作者 2024-02-15 01:29
    关注

    参考通义千问和郭老师的小迷弟雅思莫了-编写提供,主要是为了帮助您快速解决问题,如下回答,您可以参考下,如有问题,评论区留言。

    在Java 8中,对于字符串拼接的底层优化主要体现在String类的+操作符上。在JDK 5及以后版本中,编译器会对字符串字面量(常量)的拼接进行静态优化,直接在编译期间合并成一个字符串常量存储到常量池中,这不会涉及运行时创建额外对象。

    而对于非字符串字面量的动态拼接,即在运行时才知道拼接内容的情况,在Java 7及更早版本中,每使用一次+运算符拼接字符串,都会生成一个新的String对象,这是因为String是不可变的,每次拼接都需要创建新的char[]数组来存储结果。

    然而,从Java 7 Update 6之后的一个性能改进开始(这项改进后来也包含在所有后续版本中,包括Java 8),JVM实现了一种称为“字符串串联缓存”(String Concatenation Cache)的技术。对于通过StringBuilderStringBuffer完成字符串连接的地方,如果代码看起来像是连续的String变量和字面量的拼接,JVM会自动优化为使用StringBuilder来执行这些操作,并且它会尝试预估最终字符串的长度以减少数组扩容带来的性能损耗。

    具体来说,当JVM检测到可能的字符串拼接循环或多次拼接时,它会创建一个内部的字符数组(char[]),并根据需要逐步添加字符串的内容,而不是每次都创建新的String对象。这个内部的字符数组就是用来构建最终拼接结果的缓冲区。

    因此,尽管没有明确的方法可以直接查看JVM是否以及如何创建了内部的字符数组,但可以确认的是,JVM在处理非编译期优化的字符串拼接时,确实采用了更为高效的方式,利用类似于StringBuilder的机制,并预估和分配足够的字符数组空间来避免频繁的内存重分配和复制操作。

    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 2月15日
  • 创建了问题 2月15日

悬赏问题

  • ¥15 mmo能不能做客户端怪物
  • ¥15 osm下载到arcgis出错
  • ¥15 Dell g15 每次打开eiq portal后3分钟内自动退出
  • ¥200 使用python编写程序,采用socket方式获取网页实时刷新的数据,能定时print()出来就行。
  • ¥15 matlab如何根据图片中的公式绘制e和v的曲线图
  • ¥15 我想用Python(Django)+Vue搭建一个用户登录界面,但是在运行npm run serve时报错了如何解决?
  • ¥15 QQ邮箱过期怎么恢复?
  • ¥15 登录他人的vue项目显示服务器错误
  • ¥15 (标签-android|关键词-app)
  • ¥15 comsol仿真压阻传感器