1 字符串拼接的三种方法

① 加号
② concat方法
③ StringBuilder(或StringBuffer)的append方法

2 程序例子

package com.jtzen9;
public class Main {public static void main(String[] args) {String str = "a";long time = System.currentTimeMillis();for (int i = 0; i < 50000; i++) {str += "c";}System.out.println("加号所花费的时间:");System.out.println(System.currentTimeMillis()-time);String str2 = "a";time = System.currentTimeMillis();for (int i = 0; i < 50000; i++) {str2.concat("c");}System.out.println("cancat方法所花费的时间:");System.out.println(System.currentTimeMillis()-time);time = System.currentTimeMillis();StringBuilder stringBuilder = new StringBuilder("a");for (int i = 0; i < 50000; i++) {stringBuilder.append("c");}String str3 = stringBuilder.toString();System.out.println("StringBuilder的append方法:");System.out.println(System.currentTimeMillis()-time);}
}

程序输出:

3 append方法最快、concat次之、加号最慢

3.1 “+”方法

虽然编译器对字符串的加号做了优化,它会使用StringBuilder的append方法进行追加,而它最终通过toString方法转换成String字符串,上例中“+”拼接的代码即如下:

str = new StringBuilder(str).append("JTZen9").toString();

它与纯粹地使用StringBuilder的append方法是不同的:
① 每趟循环都会创建一个StringBuilder对象
② 每次执行完毕都会调用toString方法将其转换为字符串
所以,就耗费了更多的时间。

3.2 concat方法

concat源代码:

 public String concat(String str) {// 追加的字符串长度为0int otherLen = str.length();// 如果追加的字符串长度为0,则返回原字符串本身if (otherLen == 0) {return this;}// 获取原字符串的字符数组的长度int len = value.length;// 将原字符串的字符数组放到buf数组中char buf[] = Arrays.copyOf(value, len + otherLen);// 追加的字符串转化成字符数组,添加到buf中str.getChars(buf, len);// 产生一个新的字符串return new String(buf, true);}

整体是一个数组的拷贝,虽然在内存中是处理都是原子性操作,速度非常快,但是,最后的return语句创建一个新String对象,也就是每次concat操作都会创建一个新的String对象,这也是限制concat方法速度的原因。

3.3 append方法

append源代码:

public AbstractStringBuilder append(String str) {// 如果是null值,则把null作为字符串处理if (str == null)return appendNull();int len = str.length();// 追加后的字符数组长度是否超过当前值ensureCapacityInternal(count + len);// 字符串复制到目标数组str.getChars(0, len, value, count);count += len;return this;}private AbstractStringBuilder appendNull() {int c = count;ensureCapacityInternal(c + 4);final char[] value = this.value;value[c++] = 'n';value[c++] = 'u';value[c++] = 'l';value[c++] = 'l';count = c;return this;}private void ensureCapacityInternal(int minimumCapacity) {// overflow-conscious codeif (minimumCapacity - value.length > 0)expandCapacity(minimumCapacity);  // 加长,并作数组拷贝}

整个append方法都在做字符数组的处理,加长,拷贝等,这些都是基本的数据处理,整个方法内并没有生成对象。只是最后toString返回一个对象而已。

4 题外

(1)

String str = "My name is ";
str = str + "JTZen9";

相当于 str = new StringBuilder(str).append(“JTZen9”).toString();
也就是说,该str = str + “JTZen9”;语句执行完之后,总共有三个对象。

(2)

String str = "My name is " + "JTZen9";

JVM会直接把str作为一个对象,即 “My name is JTZen9”

5 使用场景

(1)大多数情况,我们使用“+”,符合编码习惯和我们的阅读
(2)当在频繁进行字符串的运算(如拼接、替换、删除等),或者在系统性能临界的时候,我们可以考虑使用concat或append方法

Java 字符串拼接效率比较相关推荐

  1. 最优雅的Java字符串拼接是哪种方式?

    title shortTitle category tag description head 最优雅的Java字符串拼接是哪种方式? Java字符串拼接 Java核心 数组&字符串 Java程 ...

  2. java字符串拼接常用方式

    方式一:+ "+",是java操作运算符比较常用的,也是简单直接的一种方式. String aa = "魅言倾馨";String bb = "子非我鱼 ...

  3. java 字符串拼接_JAVA字符串拼接常见方法汇总

    字符串的拼接,常使用到的大概有4种方式: 1.直接使用"+"号 2.使用String的concat方法 3.使用StringBuilder的append方法 4.使用StringB ...

  4. C\C++\Java字符串拼接比较

    C\C++\Java字符串拼接比较: 昨天买好小米盒子,自己折腾了一会然后就教会老妈怎么玩,怎么看还珠格格之后,我闲来无事,突然想起了上次一个项目处理字符串遇到的性能问题,然后就仔细考虑了一下,越考虑 ...

  5. Java字符串拼接“+“

    Java字符串拼接"+" 当字符串之间使用 + 号拼接的时候,系统底层会自动创建一个StringBuilder对象,然后再调用其append方法完成拼接,拼接后,再调用其toStr ...

  6. java 字符串拼接优化_JAVA字符串拼接效率

    比较string.stringbuffer.stringbuilder拼接效率 public class MainTest { public static void main(String[] arg ...

  7. java字符串拼接_为什么阿里巴巴不建议在for循环中使用quot;+quot;进行字符串拼接...

    点击上方"Java专栏",选择"置顶或者星标" 第一时间阅读精彩文章! ☞ 程序员进阶必备资源免费送「21种技术方向!」 点击查看☜ 字符串,是 Java 中最 ...

  8. Java字符串拼接的五种方法,哪种性能最好?

    作者 | 老坛酸菜WH 来源 | https://www.cnblogs.com/twzheng/p/5923642.html > 字符串拼接一般使用"+",但是" ...

  9. Java 字符串拼接 StringBuilder() StringBuffer

            字符串拼接 普通方式 public class StringDemo2 {public static void main(String[] args) {// 表示获取从1970-01 ...

最新文章

  1. 一文掌握 Linux 内存管理
  2. 手机号码归属地及运营商查询
  3. Python开发【第二篇】:Python基本数据类型
  4. android.mk local_cppflags,android.mk中LOCAL_CFLAGS 介绍
  5. GameJS——Game Library written in JavaScript
  6. rem在响应式布局中的应用
  7. Android——多线程之Handler
  8. supervisor来管理和监控进程
  9. [软件应用]深入验证Nero是否注册成功
  10. ttf字体文件裁剪,字体文件压缩,字体文件提取
  11. Texlive 2021安装卡在be patient解决方案
  12. 二级python试题分值_2020年12月计算机二级各考试科目题型及分值比例
  13. 设置Windows 10 开机默认开启NUMLOCK
  14. 创业失败的工程师内心依旧有代码
  15. 关于 NLP 中的 tokenize 总结
  16. win10做好备份如何恢复系统
  17. 利用SuperMap的水文分析提取山脊线和山谷线
  18. 1.6python网络爬虫--读取和处理纯文本格式(CSV,PDF,docx)
  19. 斗战神单机版正在连接服务器,斗战神登录卡在这里,又不提示登录失败或者连接超时什......
  20. 地图符号库的制作方法-s52符号显示库中的矢量符号描述语言

热门文章

  1. 教你用 Python 给自己画一个圣诞帽
  2. linux命令查看时间属于哪个地区,详解Linux下用date命令查看和计算包含时区的时间戳...
  3. 树莓派python手势识别控制_python树莓派相机实现手势识别源码调用的百度API_新锐下载...
  4. 笔记本电脑硬盘不见了_机械革命笔记本电脑文件不见了解决方案
  5. Linux系统没有groupadd命令怎么办
  6. mysql高可用方案对比
  7. 何时用put,get,post
  8. 2022年Redis最新面试题第8篇 - Redis缓存问题
  9. linux中修改mysql初始密码
  10. AUTOIT解决域控普通用户以管理员身份安装软件方法