String字符串拼接原理

news/2024/5/6 18:52:04/文章来源:https://blog.csdn.net/m0_51358164/article/details/127080566

前言
明白什么是引用,什么是该引用指向的真正对象。
==对于基本数据类型比较的是值,对于引用数据类型比较的是指向的对象的地址,即两者指向的是否是同一个对象。

String s = "gzc";

上述代码中s为变量引用,它存在于栈中,而“gzc”则是该变量引用所指向的真正数据,它存在于字符串常量池中。

言归正传
字符串拼接主要有2种情况:
1、常量与常量拼接

String s1 = "g"+"zc";//常量“g”与常量“zc”拼接

常量与常量拼接的原理:
字符串常量与常量之间的拼接操作其实在未加载到JVM内存之前就已经完成了,即在编译期间就会对字符串常量之间的拼接操作进行优化
如下图,进行反编译后,我们不难发现在编译完之后,s4已经被直接拼接好了。而且此时s3和s4指向的是字符串常量池中的同一个对象,即两者存储的对象地址是相同的。所以s3==s4其结果为true。
在这里插入图片描述

2、涉及到变量的字符串拼接
2.1 变量与常量拼接

String s1 = "g";
String s2 = s1+"zc";//变量s1与常量“zc”拼接

2.2 变量与变量拼接

String s1 = "g";
String s2 = "zc";
String s3 = s1+s2;//变量s1与变量s2拼接

涉及到变量的字符串拼接原理:
只要字符串拼接其中涉及到变量,不管是几个变量,那么其拼接原理都如下:
当涉及到变量时,字符串用+进行字符串拼接的本质,其实就是利用StringBuilder类里的append()方法,将每一个字符串都一一添加进去,然后返回一个StringBuilder对象,所以可以不用新创建一个对象去接收返回值,直接链式编程得到最终添加的结果,最后再调用toString()方法将其转换为我们想要的字符串String类型。
如下图:
在这里插入图片描述

特别注意:
StringBuilder的toString()方法调用的是String重载的构造器方法,是以字符数组为字符串实际内容进行创建的,并未直接以字面量方式创建String对象,即:
在这里插入图片描述
所以如果我们上述代码没有定义s3和s4两个变量,只定义了String s5 = s1+s2; 的话,那么其实字符串常量池中是不存在“gzc”这个字符串的,而是只有“g”和“zc”。因为只有通过字面量定义一个字符串以及调用String的intern()方法,这两种方式才会在字符串常量池中生成对应的对象。
而StringBuilder调用toString()方法创建的String对象则会直接在堆中为其分配内存,常量池中不会存在对应的对象。所以如果判断s3==s5,则结果为false,因为s3指向的是字符串常量池中的“gzc”,而s5指向的是堆中的“gzc”对象,二者指向的对象地址不同,则比较结果自然为false。

特殊情况:若变量被声明为final类型,即为常量,则就遵循字符串常量拼接的规则了。如下图:
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_15649.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JAVA毕设项目商店管理系统(java+VUE+Mybatis+Maven+Mysql)

JAVA毕设项目商店管理系统(javaVUEMybatisMavenMysql) 项目运行 环境配置: Jdk1.8 Tomcat8.5 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技…

wordpress字体个性化插件

wordpress字体插件可以对我们发布的文档字体大小、颜色、以及繁体简体进行切换。整洁的页面有助于提升用户阅读体验。wordpress字体插件具有可视化的字体修改页面,可以让我们调整出自己中意的文字,打造属于自己的个性化WordPress。 wordpress字体插件不需…

【Java】ArrayList和LinkedList区别?想秒懂就进来看!

ArrayList和LinkedList区别?1.底层结构不同2.ArrayList 和 LinkedList 都实现了 List 接口3.查询的对比4.添加的对比4.1 ArrayList 的添加操作4.1.1 在最后的位置添加元素4.1.2 在指定位置添加元素4.2 LinkedList 的添加操作5.总结5.1 以下情况使用 ArrayList5.2 以…

NXP i.MX 8M Mini开发板(4核 ARM Cortex-A53)硬件原理图规格说明书

前 言 本文档主要介绍NXP i.MX 8M Mini开发板硬件接口资源以及设计注意事项等内容。 创龙科技的NXP i.MX 8M Mini开发板是一款基于NXP i.MX 8M Mini的四核ARM Cortex-A53 + 单核ARM Cortex-M4异构多核处理器设计的高性能开发板,由核心板和评估底板组成。ARM Cortex-A53(64-b…

SMA2.92高频连接器的主要特点​

SMA2.92高频连接器的主要特点 2.92mm连接器的名称是以其外导体内径命名的,采用空气介质工作频率高达40GHz,可与SMA和3.5mm连接器互换对插。优越的电性能、可靠的连接尤其适用于测试系统和武*装备,成为国际上应用最为广泛的毫米微波连接器之一。 SMA2.92高…

[游戏开发][unity]Xlua中使用proto、json、lpeg

Xlua官方教程里有,在创建lua虚拟机时,可以添加3个处理数据的库 _luaEnv new LuaEnv(); _luaEnv.AddLoader(CustomLoaderMethod); _luaEnv.AddBuildin("rapidjson", XLua.LuaDLL.Lua.LoadRapidJson); _luaEnv.AddBuildin("lpeg", X…

零基础学SQL(一、数据库与SQL简介)

一、数据库(database)是什么 目录 一、数据库(database)是什么 二、数据库专业术语 三、常见数据库类型 四、什么是SQL 五、为什么要学习SQL 我们从百度词条中可以看到,百度对数据库的介绍如下: 数据库是“按照数据结构来组织、存储和管理…

RabbitMQ总结

一、简介 什么是 MQ MQ Message Queue 消息队列 消息队列:存放内容是消息的 FIFO(先入先出) 队列。是一种跨进程的通信机制,用于上下游传递消息。 为什么要用 MQ ?作用 1、应用解耦 以电商系统为例&#xff0c…

玻色量子荣获第二届“率先杯”未来技术创新大赛“决赛优胜奖”

​9月22日至23日,由中国科学院、深圳市人民政府联合主办的第二届“率先杯”未来技术创新大赛决赛在深圳、北京两地以“线上线下结合”的形式成功举办。大赛组委会办公室秘书处组织专家按照《大赛评审方案》对进入决赛的项目进行评审,经择优遴选&#xff…

vue3项目创建并运行

vue搭建 准备环境 npmnodewebpackvs code npm 使用brew命令行进行下载安装指定版本: brew install npm查看版本号: $ npm -v 8.15.0Node 进入官网nodejs,根据自己电脑的版本进行下载安装,如果是mac电脑,可以直接…

分布式文件存储系统MinIO笔记

文章目录一、MinIO介绍1、文件系统应用场景2、MinIO介绍3、MinIO优点4、MinIO的基础概念5、纠删码EC(Erasure Code)6、存储形式7、存储方案二、Minio环境搭建1、介绍2、单机部署2.1 单机部署2.2 基于Linux部署2.3 基于docker部署(推荐)3、minio 纠删码模…

塑料划分PP PE PS PA ABS PVC

**PET(聚酯)代号1, **又叫涤纶树脂,原料呈乳白色或浅黄色,透明性好,无毒,具有密度高,硬度高,耐磨损,但不耐热水侵泡,不耐碱等特点,使…

2022年暨南大学计算机830真题

学科、专业名称:网络空间安全 研究方向:网络空间安全083900 考试科目名称及代码:数据结构830 考生注意:所有答案必须写在答题纸(卷)上,写在本试题上一律不给分。 一、 单项选择题 (每题2分,共20分) 下列程…

[python刷题模板] 珂朵莉树 ODT (基于支持随机访问的跳表

[python刷题模板] 珂朵莉树 ODT (基于支持随机访问的跳表) 一、 算法&数据结构1. 描述2. 复杂度分析3. 常见应用4. 常用优化二、 模板代码0. 区间推平(lg),单点询问(lg) CF292E. Copying Data1. 区间推平,区间询问最小值2. 区…

Unity Lighting 面板的参数设置用途详细总结

一、Environment 环境光 二、Scene 1、如果选择生成LightMap 要关闭实时光,开启烘培光 lighting mode为Mixed时,lighting settings的Mixed Lighting可用于设置混合的方式:Baked Indirect mode提供最高质量的光照,其设置只牵扯间…

windows环境下elasticsearch使用教程

windows环境下elasticsearch使用教程如下: 一、首先安装jdkElasticSearch是基于lucence开发的,lucence是apache开发的,因此ElasticSearch运行环境就需要java jdk支持。所以要先安装JAVA环境。由于ElasticSearch 5.x 往后依赖于JDK 1.8的&…

HAPPE+ER:一款让脑电研究人员“更快乐”的软件,可用于事件相关电位(ERP)分析的标准化预处理管道

导读 事件相关电位(ERP)设计是用脑电图(EEG)检测神经认知功能的常用方法。然而,传统的ERP数据预处理方法是手动编辑,这是一个主观且耗时的过程。最近创建了许多自动化通道,以满足EEG数据预处理的标准化、自动化和量化的需求;然而…

知识经济时代的基石:知识协同

管理学家彼得德鲁克(1994)指出:“企业管理的本质不在于技术与程序,而在于使知识有效。”在知识占主导地位的社会里,企业依靠知识进行创新的能力代表了企业在竞争中的优势,也是企业成功与否的标志。 世界变…

C++——string的封装

参考string类完成my_string类 #include <iostream> #include<cstring> using namespace std; class my_string { private:char *str;int len; public://无参构造my_string(){len 15;str new char[len];cout<<"无参构造"<<endl;}//有参构造…

IDEA通过原型(骨架)创建MavenJavaWeb项目

IDEA通过原型&#xff08;骨架&#xff09;创建MavenJavaWeb项目 目录IDEA通过原型&#xff08;骨架&#xff09;创建MavenJavaWeb项目一、通过原型&#xff08;骨架&#xff09;创建MavenJavaWeb项目二、配置tomcat一、通过原型&#xff08;骨架&#xff09;创建MavenJavaWeb项…