Java的字符串连接符(+)
个人博客
在Java中字符串是一个常用的东西,而其一个常用的操作是字符串的拼接,Java对此提供了一种非常直观的操作方式——即 + 操作符。
String str0 = "a";
String str1 = str0 + "b";
如上的程序片段就实现了一个字符串的拼接,可以看到整个描述非常简洁,一目了然。学习Java的时候,这是接触到的第一种拼接字符串的方式,先入为主的印象会让你在以后需要拼接字符串时第一时间想到它,但是,你会听到大家都说:拼接大量的字符串时使用StringBuilder更好,这是为什么呢?
让我们看看编译器是怎么处理 + 操作符的。下面是上一个程序片段编译后的字节码指令:
public static void main(java.lang.String[]);Code:0: ldc #2 // String a2: astore_13: new #3 // class java/lang/StringBuilder6: dup7: invokespecial #4 // Method java/lang/StringBuilder."<init>":()V10: aload_111: invokevirtual #5 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;14: ldc #6 // String b16: 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_223: return
}
通过阅读这段字节码,可以发现,我们的**+**拼接操作实际上被编译器理解成了这个样子:
String str0 = "a";
StringBuilder sb = new StringBuilder();
sb.append(str0).append("b");
String str1 = sb.toString();
中间多出来了一个StringBuilder对象,这是一个临时对象。
假设我们现在有这样一段程序片段:
String str0 = "a";
for (int i = 0; i < 10000; i++) { str0 += "a";
}
再来看看编译后的字节码:
public static void main(java.lang.String[]);Code:0: ldc #2 // String a2: astore_13: iconst_04: istore_25: iload_26: sipush 100009: if_icmpge 3812: new #3 // class java/lang/StringBuilder15: dup16: invokespecial #4 // Method java/lang/StringBuilder."<init>":()V19: aload_120: invokevirtual #5 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;23: ldc #2 // String a25: invokevirtual #5 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;28: invokevirtual #6 // Method java/lang/StringBuilder.toString:()Ljava/lang/String;31: astore_132: iinc 2, 135: goto 538: return
}
5~35是我们的循环体,在循环体里面,每次拼接都会生成一个StringBuilder的临时对象,那么这个程序片段执行下去就会产生10000个StringBuilder的临时对象,这10000个临时对象都是必要的吗?显然不是,我们可以在循环体外直接创建一个StringBuilder对象,然后在循环体中通过append方法拼接字符串,这样就省下了创建并回收10000个临时对象的消耗。
所以,在需要拼接大量字符串时,还是使用StringBuilder对象为好。
Java的字符串连接符(+)相关推荐
- Java中字符串连接符“+“
如下代码块中前两个输出语句有何区别? int a = 10; int b = 20;//下面两句代码区别? System.out.println("" + a + b); Syst ...
- Java中字符串连接符(+)和append的区别
参考链接:https://www.jianshu.com/p/849f1d443b3a 文章结构: 第一部分:对+的原理进行分析 第二部分:+ 和 append 循环对比(贴出代码,以及分别循环后的反 ...
- Java的知识点5——扩展赋值运算符、 关系运算符、 逻辑运算符、字符串连接符、 条件运算符
扩展运算符 程序 public class Dd1 {public static void main(String[] args) {int a=3;int b=4;a+=b;//相当于a=a+b;S ...
- 字符串连接符(Java)
字符串连接符(Java) public class Demo0 {public static void main(String[] args) {int a=10;int b=20;a+=b; //a ...
- php字符串连接符、三元运算符
字符串连接符:. <?phpheader('content-type:text/html;charset=utf-8');echo 'my name is'.' '.'DL_one'; ?> ...
- Java的字符连接符
字符串连接符 + public static void main(String[] args) {int a = 10;int b = 20;System.out.println(a+b);//输出结 ...
- php中的连接符怎么使用,PHP字符串连接符的使用实例
原标题:PHP字符串连接符的使用实例 很多时候我们需要将几个字符串连接起来显示,在PHP中,字符串之间使用 "点" 来连接,也就是英文中的半角句号 " . ". ...
- oracle中字符串连接符||
1.oracle和mysql都遵循sql99标准(ANSI制定的,在1999年) oracle中 select 后面必须要有from关键字 在mysql中select concat('hello',' ...
- java字符串连接效率_关于java:字符串连接中的“+”是否会影响效率?
本问题已经有最佳答案,请猛点这里访问. 我在java中使用过String,StringBuilder和StringBuffer. 我想到了这个问题,而我从效率的角度思考. 字符串连接中的"+ ...
最新文章
- java 枚举转byte_如何在java中将一个枚举转换为另一个枚举?
- 途牛订单的服务化演进
- OpenCV的轮廓查找和填充
- pythonimportre_Python Re注意问题(持续更新)
- leetcode - 494. 目标和
- TensorFlow (RNN)深度学习 双向LSTM(BiLSTM)+CRF 实现 sequence labeling 序列标注问题 源码下载...
- 剑指offer(61)序列化二叉树
- [NOIP2009 最优贸易]
- 以太坊交易的打包规则
- nexus nexus3_如何在Nexus 7的主屏幕上启用横向方向
- DNS 技术标准综述
- linux docker 软路由,OpenWrt软路由使用docker安装jellyfin影音中心
- 使用线性SVM实现对垃圾邮件分类
- 计算机科学与技术以为舟,于哲舟-吉林大学计算机科学与技术学院
- c语言定义未知长度一维数组,c++ 如何定义未知元素个数的数组
- uniapp本地数据库_Uniapp教程|App/uni-app离线本地存储方案
- 秋夜长,怎奈碎念悠怅
- Pomelo框架总结
- 移动端Chrome怎样才能一直保持桌面版网站呢?
- tinymce 多图上传,上传文件,上传视频,单图上传