个人博客
在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的字符串连接符(+)相关推荐

  1. Java中字符串连接符“+“

    如下代码块中前两个输出语句有何区别? int a = 10; int b = 20;//下面两句代码区别? System.out.println("" + a + b); Syst ...

  2. Java中字符串连接符(+)和append的区别

    参考链接:https://www.jianshu.com/p/849f1d443b3a 文章结构: 第一部分:对+的原理进行分析 第二部分:+ 和 append 循环对比(贴出代码,以及分别循环后的反 ...

  3. Java的知识点5——扩展赋值运算符、 关系运算符、 逻辑运算符、字符串连接符、 条件运算符

    扩展运算符 程序 public class Dd1 {public static void main(String[] args) {int a=3;int b=4;a+=b;//相当于a=a+b;S ...

  4. 字符串连接符(Java)

    字符串连接符(Java) public class Demo0 {public static void main(String[] args) {int a=10;int b=20;a+=b; //a ...

  5. php字符串连接符、三元运算符

    字符串连接符:. <?phpheader('content-type:text/html;charset=utf-8');echo 'my name is'.' '.'DL_one'; ?> ...

  6. Java的字符连接符

    字符串连接符 + public static void main(String[] args) {int a = 10;int b = 20;System.out.println(a+b);//输出结 ...

  7. php中的连接符怎么使用,PHP字符串连接符的使用实例

    原标题:PHP字符串连接符的使用实例 很多时候我们需要将几个字符串连接起来显示,在PHP中,字符串之间使用 "点" 来连接,也就是英文中的半角句号 " . ". ...

  8. oracle中字符串连接符||

    1.oracle和mysql都遵循sql99标准(ANSI制定的,在1999年) oracle中 select 后面必须要有from关键字 在mysql中select concat('hello',' ...

  9. java字符串连接效率_关于java:字符串连接中的“+”是否会影响效率?

    本问题已经有最佳答案,请猛点这里访问. 我在java中使用过String,StringBuilder和StringBuffer. 我想到了这个问题,而我从效率的角度思考. 字符串连接中的"+ ...

最新文章

  1. java 枚举转byte_如何在java中将一个枚举转换为另一个枚举?
  2. 途牛订单的服务化演进
  3. OpenCV的轮廓查找和填充
  4. pythonimportre_Python Re注意问题(持续更新)
  5. leetcode - 494. 目标和
  6. TensorFlow (RNN)深度学习 双向LSTM(BiLSTM)+CRF 实现 sequence labeling 序列标注问题 源码下载...
  7. 剑指offer(61)序列化二叉树
  8. [NOIP2009 最优贸易]
  9. 以太坊交易的打包规则
  10. nexus nexus3_如何在Nexus 7的主屏幕上启用横向方向
  11. DNS 技术标准综述
  12. linux docker 软路由,OpenWrt软路由使用docker安装jellyfin影音中心
  13. 使用线性SVM实现对垃圾邮件分类
  14. 计算机科学与技术以为舟,于哲舟-吉林大学计算机科学与技术学院
  15. c语言定义未知长度一维数组,c++ 如何定义未知元素个数的数组
  16. uniapp本地数据库_Uniapp教程|App/uni-app离线本地存储方案
  17. 秋夜长,怎奈碎念悠怅
  18. Pomelo框架总结
  19. 移动端Chrome怎样才能一直保持桌面版网站呢?
  20. tinymce 多图上传,上传文件,上传视频,单图上传

热门文章

  1. 工单状态TECO/DLV
  2. 打开jupyter notebook 报错 404GET/static/components/marked/lib/marked.js?
  3. 认识Linux系统结构
  4. CRM- Salesforce体验报告
  5. JavaScript分页功能如何实现
  6. 奋斗的小青年的逻辑回归整理
  7. 手把手教你升级Keil MDK的ARM编译器
  8. HTML5 <a> 标签
  9. Kotlin 代码生成 之 kotlinpoet 使用
  10. oul可以用作c语言常量吗,吉大15秋学期《C语言程序设计》在线作业二 答案