当前位置:网站首页>解析字符串拼接的两种情况
解析字符串拼接的两种情况
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 如果是字符串字面量与字符串字面量进行拼接,那么还是去方法区的字符串常量池去开辟空间,进行==比较的话还是去看他们俩指向的字符串常量池的字符串的地址是否相同
边栏推荐
- (科普文)什么是碎片化NFT(Fractional NFT)
- 存储器映射、位带操作
- 华为「天才少年」计划招募的博士们,迎来首秀!
- Flask introductory learning tutorial
- Configuration - Notes
- yarn安装详细教程说明、升级教程、修改yarn的全局和缓存目录、yarn基本命令
- Could not acquire management access for administration
- [In-depth study of 4G/5G/6G topic-46]: 5G Link Adaption Link Adaption-2-Common Abbreviations
- Debug - Notes
- SQL 优化这么做就对了!
猜你喜欢
[Cloud native] Grayscale release, blue-green release, rolling release, grayscale release explanation
Lock wait timeout exceeded解决方案
(Crypto必备干货)详细分析目前NFT的几大交易市场
Excel uses Visual Basic Editor to modify macros
GeoServer
后浪来袭!阿里产出“第二代”容器技术手册及脑图,这也太香了吧
ECCV2022 | FPN错位对齐,实现高效半监督目标检测 (PseCo)
(Crypto essential dry goods) Detailed analysis of the current NFT trading markets
华为「天才少年」计划招募的博士们,迎来首秀!
B+树索引页大小是如何确定的?
随机推荐
TiUP 命令概览
Ts是什么?
Our company has used gateway services for 6 years, dynamic routing, authentication, current limiting, etc., a stable batch!
针对 MySQL/InnoDB 刷盘调优
tiup install
tiup completion
调试 - 笔记
R中按照数字大小进行排序
Flask入门学习教程
CMake库搜索函数居然不搜索LD_LIBRARY_PATH
How to do a good job in technology selection
数据库 - 创建数据库、表、函数等
如何做好技术选型
分布式前修课:MySQL实现分布式锁
golang modules初始化项目
timed task corn
【喂到嘴边了的模块】准备徒手撸GUI?用Arm-2D三分钟就够了
tiup help
编译、链接 - 笔记 - 3
【云原生 • DevOps】influxDB、cAdvisor、Grafana 工具使用详解