Java String 拼接字符串原理详解
作者:amCharlie 发布时间:2023-05-14 10:10:33
标签:Java,String,拼接字符串
首先来一道思考题:
String str1 = "111111";
String str2 = "222222";
String str = str1 + str2;
System.out.println(str);
很明确,上述代码输出的结果是:"111111222222",但是它工作原理是怎样的呢?
由于字符串拼接太常用了,java才支持可以直接用+号对两个字符串进行拼接。**其真正实现的原理是中间通过建立临时的StringBuilder对象,然后调用append方法实现**。如何验证呢?
上述代码文件写在Test.java main方法中,使用<b>javac Test.java</b>编译,在执行<b>javap -verbose Test</b>,可以看到如下信息:
0: ldc #2 // String 111111
2: astore_1
3: ldc #3 // String 222222
5: astore_2
6: new #4 // class java/lang/StringBuilder
9: dup
10: invokespecial #5 // Method java/lang/StringBuilder."":()V
13: aload_1
14: invokevirtual #6 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
17: aload_2
18: invokevirtual #6 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
21: invokevirtual #7 // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
24: astore_3
25: getstatic #8 // Field java/lang/System.out:Ljava/io/PrintStream;
28: aload_3
29: invokevirtual #9 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
32: return
对于java来说,这段代码原理上应该是:
String str1 = "111111";
String str2 = "222222";
StringBuilder sb = new StringBuilder();
sb.append(str1);
sb.append(str2);
String str = sb.toString();
System.out.println(str);
再来一道思考题,如下代码的执行结果是什么?是报错,还是"null222222":
String str1 = null;
String str2 = "222222";
String str = str1 + str2;
System.out.println(str);
正确答案是:"null222222"。原理:
String str1 = null;
StringBuilder sb = new StringBuilder();
sb.append(str1 );
这段代码,StringBuilder对象append一个null字符串会怎么处理呢,这就要去查看源码了。源码中我们可以看到以下这段代码:
public StringBuilder append(StringBuffer sb) {
super.append(sb);
return this;
}
该方法继承了父类的方法,父类为AbstractStringBuilder,再去父类中查看:
private StringBuilder append(StringBuilder sb) {
if (sb == null)
return append("null");
int len = sb.length();
int newcount = count + len;
if (newcount > value.length)
expandCapacity(newcount);
sb.getChars(0, len, value, count);
count = newcount;
return this;
}
真相大白了,这里null会变成"null"。因此答案就是"null222222"了。
总结:
String字符串拼接通过StringBuilder走中间过程,通过append方法实现
null拼接会变成字符串"null"
程序有大量字符串拼接时,建议考虑直接写StringBuilder实现,就不需要底层new很多临时sb对象了。
来源:https://blog.csdn.net/u012337114/article/details/81317992


猜你喜欢
- 常量是在编译时已知并在程序的生存期内不发生更改的不可变值。常量使用 const 修饰符进行声明。只有 C# 内置类型(System.Obje
- 关于Context我们首先应该知道:(1)它描述的是一个应用程序环境的信息,即上下文。(2)该类是一个抽象(abstract class)类
- Android MTU 值修改的实例详解通信术语 最大传输单元(Maximum Transmission Unit,MTU)是指一种通信协议
- 看前欣赏美图!上才艺!目录 一.顺序结构二.分支结构1.if语句2.switch 语句 三. 循环结构1 .while 循环2. break
- 前言对于移动开发者来说,“将耗时的任务放到子线程去执行,以保证UI线程的流畅性”是线程编程的第一金科玉律,但这条铁则往往也是UI线程不怎么流
- 使用Spring data JPA开发已经有一段时间了,这期间学习了一些东西,也遇到了一些问题,在这里和大家分享一下。前言:Spring d
- //把txt清空 &n
- 本文实例讲述了C#利用原图和水印图的重叠简单实现水印的方法。分享给大家供大家参考,具体如下:图片操作类/// <summary>
- Android 中Activity 之间传递参数1.传递简单数据在A Activity中findViewById(R.id.startBAc
- 试题描述:一个球场C的球迷看台可容纳M*N个球迷。官方想统计一共有多少球迷群体,最大的球迷群体有多少人。球迷选座特性:同球迷群体会选择相邻座
- 代码如下所示:using System;using System.Collections.Generic;using System.Text
- Java中数组被实现为对象,它们一般都会因为记录长度而需要额外的内存。对于一个原始数据类型的数组,一般需要24字节的头信息再加上保存值所需的
- 本文实例为大家分享了Android app应用实现多语言切换功能,供大家参考,具体内容如下1.添加多语言文件 在不同的 value 文件夹下
- 需要装一个插件:File - Settings- Plugins - 搜索gson 安装GsonFromat;如下两张图安装完成后 ,新建一
- 图像切换器(ImageSwitcher),用于实现类似于windows操作系统下的windows照片查看器中的上一张 下一张切换图片的功能,
- 一、概述 在C和C++语言中都有assert关键,表示断言。在Java中,同样也有assert关键字,表示断言,用法和含义都差不多
- 最新idea2020安装部署超详细教程懂得懂的2020.32020.2.42020.2.32020.2.220.2.12019.32018.
- 垃圾回收器要回收对象的时候,首先要调用这个类的finalize方法(你可以 写程序验证这个结论),一般的纯Java编写的Class不需要重新
- 有项目需求需要绘制多个圆圈,并且使用连续的数字对其排列起来,也就是好多排的圆圈。首先看一下效果图:一排设置为8个,一共有53个的:一排设值为
- 引入dll 本次程序中引入的是Spire.Pdf.dll,引入方法如下:【方法1】通过NuGet安装。可以在Visual Stud