当前位置:网站首页>解析字符串拼接的两种情况
解析字符串拼接的两种情况
2022-07-30 14:56:00 【SSS4362】
解析字符串拼接的两种情况
1 字符串字面量进行拼接
1.1 内容
1.1.1 例子
如String s1=“s”+“h”;String s2=“sh”;
1.1.2 分析过程
s1=“s”+"h"这个过程
a 在字符串常量池中先查看是否有已经开辟了s字符串和h字符串的空间
b 若没有则需要先在字符串常量池里面开辟字符串字面量s和字符串字面量h的空间
c 因为使用了+进行拼接,所以也会先去字符串常量池中查找里面是否已经存在sh这个字面量了,
d 我们这个时候发现里面并没有存在sh这个字符串,因此会去开辟一个属于sh字符串的空间,并把这个空间的地址赋值给了s1
s2="sh"这个过程
我们会先去字符串常量池中查找是否已经存在sh这个字符串,发现已经存在了这个字符串,那么我们这个时候只需要将"sh"这个字符串在字符串常量池中的内存地址赋值给s2就行
结论: s1==s2的结果为true
因为s1、s2指向的内存地址都相同,都指向的是在字符串常量池中的"sh"这个字符串开辟的空间
1.2 示例代码
package Work;
public class Test05 {
public static void main(String[] args) {
String s1="s"+"r";
String s2="sr";
System.out.println(s1==s2);
}
}
1.3 示例代码生成的字节码文件的反编译代码
package Work;
import java.io.PrintStream;
public class Test05
{
public Test05()
{
}
public static void main(String args[])
{
String s1 = "sr";
String s2 = "sr";
System.out.println(s1 == s2);
}
}
1.4 示例代码运行截图

2 字符串变量进行拼接
2.1 内容
a 如果是字符串变量进行拼接,这个时候就会new StringBuilder对象去进行拼接,
b 因为它并不知道你那个变量里面存放了多长的字符串,用字符串常量池去存储变量的会没有必要,因此为了节约空间,因此只要涉及到字符串变量与字符串字面量(能清楚的知道里面的值,如"12")的拼接操作本质上还是new了一个StringBuilder去进行拼接操作(append),
c 然后调用toString方法(本质还是new了一个String对象进行返回的)去返回String对象
2.2 示例代码
package Work;
public class Test05 {
public static void main(String[] args) {
String s1="s";
String s2=s1+"r";
String s3="sr";
System.out.println(s2==s3);
}
}
2.3 示例代码生成的字节码文件的反编译代码
package Work;
import java.io.PrintStream;
public class Test05
{
public Test05()
{
}
public static void main(String args[])
{
String s1 = "s";
String s2 = (new StringBuilder()).append(s1).append("r").toString();
String s3 = "sr";
System.out.println(s2 == s3);
}
}
2.3 示例代码运行截图

3 总结
3.1 只要涉及到字符串变量与字符串字面量进行拼接操作,那么它一定会new StringBuffer对象去进行拼接操作,然后调用StringBuffer对象里面的toString方法(实际上了new了一个String对象)去返回一个String类型的结果
3.1.1 StringBuffer的toString方法源码
public String toString() {
// Create a copy, don't share the array
return new String(value, 0, count);
}
3.2 如果是字符串字面量与字符串字面量进行拼接,那么还是去方法区的字符串常量池去开辟空间,进行==比较的话还是去看他们俩指向的字符串常量池的字符串的地址是否相同
边栏推荐
- Example of video switching playback (video switching example) code
- 让人上瘾的新一代开发神器,彻底告别Controller、Service、Dao等方法
- TiDB 工具下载
- 【云原生】阿里云ARMS业务实时监控
- 科研中一些常用软件清单
- 关于MySQL主从复制的数据同步延迟问题
- Mysql数据库查询好慢,除了索引,还能因为什么?
- 微服务架构下的核心话题 (二):微服务架构的设计原则和核心话题
- 微服务该如何拆分?
- Our company has used gateway services for 6 years, dynamic routing, authentication, current limiting, etc., a stable batch!
猜你喜欢

存储器映射、位带操作
4 senior experts share the insider architecture design and implementation principles of Flink technology with years of experience in large factories

xxl-job源码解析(技术分享)

Excel使用Visual Basic Editor对宏进行修改

视频切换播放的例子(视频切换范例)代码

Alluxio为Presto赋能跨云的自助服务能力

Delayed message queue

阿里CTO程立:阿里巴巴的开源历程、理念和实践

【云原生】灰度发布、蓝绿发布、滚动发布、灰度发布解释

组态 - 笔记
随机推荐
GeoServer
元宇宙的前景及四大赛道
4 senior experts share the insider architecture design and implementation principles of Flink technology with years of experience in large factories
R中按照数字大小进行排序
华为云重磅发布开源软件治理服务——软件成分分析
TiUP 故障排查
Our company has used gateway services for 6 years, dynamic routing, authentication, current limiting, etc., a stable batch!
Office Automation | Office Software and Edraw MindMaster Shortcuts
(Crypto必备干货)详细分析目前NFT的几大交易市场
Delayed message queue
Use of InputStream and OutputStream
The Prospects of the Metaverse and the Four Tracks
关于MySQL主从复制的数据同步延迟问题
InputStream和OutputStream流的使用
nodejs环境变量设置
The use and principle of distributed current limiting reduction RRateLimiter
让人上瘾的新一代开发神器,彻底告别Controller、Service、Dao等方法
Flask入门学习教程
Sentinel
数字量输入模块io