自JDK1.8之后,String拼接字符串的底层原理

jdk1.8的字符串常量拼接是怎样的过程? 在 JDK 1.8 中,字符串常量的拼接过程包括编译时的常量折叠和运行时的StringBuilder优化。常量折叠在编译时完成,而对于包含变量或方法调用的拼接,编译器会将其转换为StringBuilder操作,以提高运行时的性能。 阅读详情

以下内容皆是基于JDK1.8之后的版本进行的讨论和验证,并且使用javap -v指令显示底层的汇编指令从而查看真实过程:

    String进行字符串拼接:

上代码

    测试样例:

class Main{
	public static void main(String[] args){
		String a="asd";
		a=a+"bd";
	}
}

    调用javap指令的结果

{
  Main();
    descriptor: ()V
    flags:
    Code:
      stack=1, locals=1, args_size=1
         0: aload_0
         1: invokespecial #1                  // Method java/lang/Object."<init>":()V
         4: return
      LineNumberTable:
        line 1: 0

  public static void main(java.lang.String[]);
    descriptor: ([Ljava/lang/String;)V
    flags: ACC_PUBLIC, ACC_STATIC
    Code:
      stack=2, locals=2, args_size=1
         0: ldc           #2                  // String asd
         2: astore_1
         3: new           #3                  // class java/lang/StringBuilder
         6: dup
         7: invokespecial #4                  // Method java/lang/StringBuilder."<init>":()V
        10: aload_1
        11: invokevirtual #5                  // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
        14: ldc           #6                  // String bd
        16: invokevirtual #5                  // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
        19: invokevirtual #7                  // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
        22: astore_1
        23: return
      LineNumberTable:
        line 3: 0
        line 4: 3
        line 5: 23
}

    可知,当我们使用“+”拼接字符串的时候,实际上是创建了一个StringBuilder对象,并使用该对象的append方法进行字符串拼接,然后将得到的字符串通过toString方法返回给字符串对象。

    经过测试可知,代码如下:

class Main{
	public static void main(String[] args){
		String b="ljk";
		b=b+"qwe";
		String a="asd";
		a=a+"bd";
		a=a+b;
		b=a+b;
	}
}

    当我们需要使用“+”多次拼接字符串的时候,每次使用“+”,都会创建一个StringBuilder的对象,然后执行上述过程,得到拼接后的结果的字符串。

    因此,String字符串的“+”拼接的效率相对于StringBuilder和StringBuffer来说还是比较低下的,在进行字符串拼接时还是应该尽量使用StringBuilder和StringBuffer方法,其中,StringBuffer因为部分函数通过synchronized关键字声明,所以线性安全,而StringBuilder则线性不安全,但在单线程中的进行字符串拼接时,StringBuilder的效率高于StringBuffer。

JDK 9 中的字符串拼接优化:深入解析与实际应用 JDK 9 中引入的 Compact Strings 机制通过优化字符串的存储和拼接性能,显著提升了字符串操作的效率。通过根据字符串的内容选择合适的编码方式,减少了内存占用,提高了程序的执行效率。在实际编程中,理解并应用这一机制,有助于编写更高效、更节省内存的代码。希望通过本文的详细解释和代码示例,你已经对 JDK 9 中的字符串拼接优化有了更深入的理解。如果你有任何问题或需要进一步的解释,请随时提问! 阅读详情

相关推荐

JDK 9 中 String 的底层存储从 `char[]` 改为 `byte[]`:深入解析与实际应用

JDK 9 中String类的底层存储从char[]改为byte[],并引入了 Compact Strings 特性,显著优化了String类的性能和内存使用。通过根据字符串的内容选择合适的编码方式,减少了内存占用,提高了程序的执行效率。在实际编程中,这一改变对大量使用 Latin-1 字符串的应用产生了显著的内存优化和性能提升。希望通过本文的详细解释和代码示例,你已经对 JDK 9 中String类的底层存储变化有了更深入的理解。如果你有任何问题或需要进一步的解释,请随时提问!

xycxycooo的博客 2125

JDK1.8之String.join()

记录 今天在阅读 String 源码时,无意间看到了这个方法,以前也没有见过用过,那么就要好好研究一下。 源码 //返回一个新的String,该String由CharSequence元素的副本组成,这些元素与指定的副本连接在一起。 Returns a new String composed of copies of the {@code CharSequence elements} joi...

CodingMayCry 1289

关于JDK8中的字符串拼接示例详解

字符串拼接问题应该是每个Java程序员都熟知的事情了,几乎每个Java程序员都读过关于StringBuffer/StringBuilder来拼接字符串。下面这篇文章主要给大家介绍了关于JDK8中的字符串拼接的相关资料,需要的朋友可以参考下。

java String(字符串),StringBuilder(字符串缓冲区),StringJoiner(字符串拼接 JDK1.8之后)

String字符串 1.String 1.1 String概述 String类就是用来表示字符串的 特点: 字符串字面值(“abc” ,“今天天气真好” , “123”) 都是String类的对象 一旦被创建就不可以更改 1.2 String类的构造方法 方法名 说明 public String() 创建一个空白的字符串对象,不含有任何内容 public String(char[ ] chs) 根据字符数组的内容,来创建字符串对象(把一个字符数组转换成字符串) public St

Aming_sth的博客 595

Python爬虫实战:5分钟搞定Web of Science文献批量导出与解析(附完整代码)

本文提供了一套利用Python爬虫技术,快速实现Web of Science文献批量提取与解析的完整方案。通过解析官方导出的HTML文件,结合BeautifulSoup和pandas库,可将文献数据自动转换为结构化的Excel/CSV表格,帮助科研人员高效管理文献信息,节省大量手动整理时间。

weixin_29050513的博客 1171

【GD32F407】i2c主机发送,从机中断接收

前言 现在手里负责的一个项目需要用i2c和主芯片进行通信主动发送,中断接收,这就需要支持i2c主机模式和从机模式,先查看原理图 这里我们用到了两条i2c总线进行数据的交替传输,避免在使用一条总线是发送数据和接收数据冲突 初始化i2c控制器 s32_k i2cDevInit(u8 byBusId, TI2cBus *pTI2cBus) { //PCLK = 36000000 BOOL retFlg = FALSE; int I2xSCL = pTI2cBus->byFastMode ?

Enosji的博客 6247

JDK1.8/1.9以后String 和 StringBuilder 以及StringBuffer详细介绍

当处理字符串时,Java 提供了三个主要的类:String、StringBuilder 和 StringBuffer。String 类是 Java 中用于表示字符串的不可变类,其底层实现是通过一个 private final char[] value 数组来保存字符串的字符数据。这个 value 数组被声明为 final,表示一旦创建,它的引用指向的内存地址就不能再改变,也就是说,String 对象创建后,其值是不可变的。

小电玩 849

【Qualcomm高通音频】音效调试_录音文件播放有杂音,如何定位原因?

一、录音播放数据处理过程介绍 (1)TX方向 麦克风(硅麦克风或者主机体麦克风)采集模拟音频信号,经过内部CODEC芯片中的adc转换为数字信号,在经过高通音频DSP处理音效后编码为wav/aac/amr/mp3等格式文件。 (2)RX方向 音频文件经过解码、重采样还原为pcm数据,经过DSP处理音效后送到内部CODEC,然后经过DAC转换为模拟信号,送到喇叭。 二、分析步骤 1...

crow_ch的博客 5976

JDK1.8字符串拼接利器-StringJoiner

1.8之前 在JDK1.8以前,我们对多个字符串的拼接过程大多使用遍历+字符串追加来解决的。但是这样的方法往往会在结果末尾多出来一个分隔符,如下图(能直接考虑到的最简单方式)。 由此可见,这样的拼接方法是有缺陷的。我们这里不多解释,直接切入正题。 1.8之后 JDK1.8之后引入了一个新的Java工具类-StringJoiner,使用该工具类可以轻松的完成字符串拼接工作,在实际开发中或多或少会有些帮助。1.8据我目前了解到的字符串拼接方式有三种,下面会一一举例出来。那么接下来直接了解一下该类的使用方式:

Jomo_Com1的博客 1485

Nacos 2.3.2与PostgreSQL的Docker化部署实战

本文详细介绍了Nacos 2.3.2与PostgreSQL的Docker化部署实战,包括环境准备、数据库配置、镜像获取与导入、容器部署及常见问题排查。通过Docker容器化技术,结合PostgreSQL的稳定性和扩展性,为微服务架构提供高效的服务发现和配置管理解决方案。

k5l6m的博客 284

版图提取的spice网表中参数含义及二级效应STI/WPE

寄生电阻、寄生电容可以从版图提出的.sp文件中看, ad area of drain 面积 as area of source pd perimeter of drain 周长,PS PD周长都不计算与栅极接触的部分 ps perimeter of source nrd 漏扩散区等效方块数 nrs 源扩散区等效方块数 sa ...

qq_40007892的博客 6555

JVM String常量池

JVM StringTable String:字符串,使用一堆""引起表示 String s1 = “atguigu”; String s2 = new String(“atguigu”); String声明为final的,不可被继承 String实现了Serializable接口,表示可以序列化 String实现了Comparable接口,表示可以排序 JDK1.8之前String底层时char[],JDK1.9变为byte[]。 字符串常量池 字符串常量池中不会存储相同内容的字符串 Stri

anying5823的博客 217

Zemax操作40--序列模式中LD光源模拟

LD模拟

lzy750750的博客 9124

String深入浅出

String 深入浅出

HGW的博客 529

计算机毕设:线性回归 Xgboost LSTM 预测黄金价格实战 完整代码数据视频讲解 可直接运行

线性回归 Xgboost LSTM 预测黄金价格实战 完整代码数据视频讲解 可直接运行

1766

Silly Tavern酒馆ai角色卡与世界书导入超详细教程!

前几天,我在设置 Silly Tavern 的时候,想导入一个喜欢的角色卡,结果发现不少朋友其实已经下载好了角色资源,但却不知道怎么正确导入使用。这篇文章就作为一份完整的新手向教程,一步步教你如何在 Silly Tavern 中导入角色卡、世界书,并实现与 AI 角色的真实互动。如果你是第一次接触这个功能,建议先收藏慢慢看~点击菜单栏上的 图标,打开角色界面。初始状态下,你应该只看到默认角色 Seraphina。你可以先点击她的头像尝试聊天,也可以导入自己喜欢的角色。点击导入按钮,选择你下载好的角色卡(通

代码简单说 Vue、JAVA、PHP、Node.js 熟练运用,接口、架构、性能全搞定。 2万+

String拼接字符串底层原理

JDK版本:1.8 先上结果: 原理:jdk1.8之后字符串拼接底层就是创建了一个StringBuilder,然后调用append方法,最后调用toString转化成String 结论:java9之前,StringBuilder的append方法效率永远大于用+拼接,且拼接次数越多,差距越大! (9之后呢?https://blog.csdn.net/qq_35425070/article/...

qq_35425070的博客 9003

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

【JAVA】字符串相关类的底层原理

在所有的编程语言中,字符串是应用最广泛的一种数据类型,它是由一系列字符(如字母、数字、符号)组成的一种数据类型。在Java中,字符串一旦创建就不能修改,每次操作都会产生一个新的字符串。那么这些特性背后的内存原理是怎样的?这就是我今天要分享的主题:字符串在java内存中的底层原理。

2302_79323248的博客 1758

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

JAVA | 聚焦 String 的常见用法与底层内存原理

API(Application Programming Interface)应用程序编程接口简单理解:API就是别人已经写好的东西,我们不需要自己编写,直接使用即可Java API: 指的就是JDK提供的各种功能的Java类这些类将底层的实现封装了起来,我们不需要关心这些类是如何实现的,只需要学习这些类如何使用即可。java.lang.String类代表字符串,java程序中的所有字符串文字(例如:”abc“)都为此类的对象。String 是java定义好的一个类。

爱因斯晨的博客 2550

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

【jvm系列-08】精通String字符串底层原理和运行机制(详解)

深入理解String字符串的底层机制

zhenghuishengq的博客 9687

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

说起String拼接,大家会想到几个对比: String:常量,不可变,不适合用来字符串拼接,每次都是新创建的对象,消耗较大。 StringBuffer:适合用来作字符串拼接 StringBuilder:JDK1.5引入,适合用来作字符串拼接,与StringBuffer区别是他不是线程安全的 接下来进入正题String”+”拼接底层实现原理 曾见...

社会你鑫哥的博客 6167

String.intern()详细分析,JDK1.8

前言   本文的测试环境是JDK1.8。   String.intern()分析在文中偏后 一.创建字符串分析 1.直接使用双引号创建字符串  判断这个常量是否存在于常量池,   如果存在,    判断这个常量是存在的引用还是常量,     如果是引用,返回引用地址指向的堆空间对象,     如果是常量,则直接返回常量池常量,   如果不存在,     在常量池中创建该常量,并返回此常量 ...

小页睡着了的博客 1万+

Java学习笔记8.——字符串以及底层原理(案例练习)

这节讲了字符串的比较,拼接,创建的底层原理,以及常用的几种String方法和对象。比如STringBuilder对象,StringJoiner对象,这个对象是jdk8以后出现的。replace方法,charAt方法,subString方法。1.api开发文档等于java字典2.String 的两种赋值方式,一个在串池,一个在堆区3.==比较的内容基本数据类型比较的具体的值引用数据类型比较的是地址值4.String拼接的原理。

muzik_ijik的博客 1216

String字符串拼接 底层原理

String字符串拼接的原理, 如String s = "abd" + "cff"

灿的博客 526

字符串常量池(String Constant Pool)全解析:原理、实现、场景与底层细节

字符串常量池(String Constant Pool)是 Java 中优化字符串内存的核心机制,本质是 JVM 运行时数据区中的字符串驻留池,通过复用相同内容的字符串对象,减少内存开销、提升性能。

HANhylyxy的博客 5523
上一篇: SSM框架(SpringMVC+spring+mybatis)原理
下一篇: mybatis报错:Parameter 'xxx' not found.
CCCAAAAFFFFF
博客等级 码龄10年 5粉丝 27原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值