字符串拼接五种方式区别以及效率

批量数据处理开发推荐使用4,5

  1. 加号 “+”:可以用字符串与任意类型“+”号拼接
  2. String contact() 方法:调用和传入都必须是字符串,而且调用方不能为null
  3. StringUtils.join() 方法
  4. StringBuffer append() 方法
  5. StringBuilder append() 方法

字符串拼接一般使用“+”,但是“+”不能满足大批量数据的处理,Java中有五种方法处理字符串拼接,各有优缺点,程序开发应选择合适的方法实现。

经过简单的程序测试,从执行100次到90万次的时间开销如下表:

由此可以看出:

  1. 方法1 加号 “+” 拼接 和 方法2 String contact() 方法 适用于小数据量的操作,代码简洁方便,加号“+” 更符合我们的编码和阅读习惯;
  2. 方法3 StringUtils.join() 方法 适用于将ArrayList转换成字符串,就算90万条数据也只需60ms,可以省掉循环读取ArrayList的代码;
  3. 方法4 StringBuffer append() 方法 和 方法5 StringBuilder append() 方法 其实他们的本质是一样的,都是继承自AbstractStringBuilder,效率最高,大批量的数据处理最好选择这两种方法。
  4. 方法1 加号 “+” 拼接 和 方法2 String contact() 方法 的时间和空间成本都很高,不能用来做批量数据的处理。

源码分析:

1. 其实每次调用contact()方法就是一次数组的拷贝,虽然在内存中是处理都是原子性操作,速度非常快,但是,最后的return语句会创建一个新String对象,限制了concat方法的速度。

2. StringBuffer 和 StringBuilder 的append方法都继承自AbstractStringBuilder,整个逻辑都只做字符数组的加长,拷贝,到最后也不会创建新的String对象,所以速度很快,完成拼接处理后在程序中用strBuffer.toString()来得到最终的字符串。

 

3. 字符串的加号“+” 方法, 虽然编译器对其做了优化,使用StringBuilder的append方法进行追加,但是每循环一次都会创建一个StringBuilder对象,且都会调用toString方法转换成字符串,所以开销很大。
注:执行一次字符串“+”,相当于 str = new StringBuilder(str).append("a").toString();
4. 本文开头的地方统计了时间开销,根据上述分析再想想空间的开销。常说拿空间换时间,反过来是不是拿时间换到了空间呢,但是在这里,其实时间是消耗在了重复的不必要的工作上(生成新的对象,toString方法),所以对大批量数据做处理时,加号“+” 和 contact 方法绝对不能用,时间和空间成本都很高。

测试源代码,感兴趣的可以进行测试

package com.test.java;

import java.util.ArrayList;
import java.util.List;

import org.apache.commons.lang.StringUtils;

public class TestJavaSe {
	
	public static void main(String[] args) {
		TestJavaSe t = new TestJavaSe();
		t.testPlus();
		t.testConcat();
		t.testJoin();
		t.testStringBuffer();
		t.testStringBuilder();
	}
	
	private static final int max = 100;

	//"+"号拼接
	public void testPlus() {
		System.out.println(">>>+号 <<<");

		String str = "";

		long start = System.currentTimeMillis();

		for (int i = 0; i < max; i++) {
			str = str + "a";
		}

		long end = System.currentTimeMillis();

		long cost = end - start;

		System.out.println("   {str + \"a\"} cost=" + cost + " ms");
	}

	public void testConcat() {
		System.out.println(">>> String contact() <<<");

		String str = "";

		long start = System.currentTimeMillis();

		for (int i = 0; i < max; i++) {
			str = str.concat("a");
		}

		long end = System.currentTimeMillis();

		long cost = end - start;

		System.out.println("   {str.concat(\"a\")} cost=" + cost + " ms");
	}

	public void testJoin() {
		System.out.println(">>> StringUtils.join() <<<");

		long start = System.currentTimeMillis();

		List<String> list = new ArrayList<String>();

		for (int i = 0; i < max; i++) {
			list.add("a");
		}

		long end1 = System.currentTimeMillis();
		long cost1 = end1 - start;

		StringUtils.join(list, "");

		long end = System.currentTimeMillis();
		long cost = end - end1;

		System.out.println("   {list.add(\"a\")} cost1=" + cost1 + " ms");
		System.out.println("   {StringUtils.join(list, \"\")} cost=" + cost + " ms");
	}

	public void testStringBuffer() {
		System.out.println(">>> StringBuffer append() <<<");

		long start = System.currentTimeMillis();

		StringBuffer strBuffer = new StringBuffer();

		for (int i = 0; i < max; i++) {
			strBuffer.append("a");
		}
		strBuffer.toString();

		long end = System.currentTimeMillis();

		long cost = end - start;

		System.out.println("   {strBuffer.append(\"a\")} cost=" + cost + " ms");
	}

	public void testStringBuilder() {
		System.out.println(">>> StringBuilder append() <<<");

		long start = System.currentTimeMillis();

		StringBuilder strBuilder = new StringBuilder();

		for (int i = 0; i < max; i++) {
			strBuilder.append("a");
		}
		strBuilder.toString();

		long end = System.currentTimeMillis();

		long cost = end - start;

		System.out.println("   {strBuilder.append(\"a\")} cost=" + cost + " ms");
	}
}

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java 字符串拼接有多种方式可以选择,不同的方式适用于不同的场景和要求。 1. 使用"+"运算符:这是最常见的字符串拼接方式。它简单直接,适用于少量字符串拼接操作。例如: ```java String str = "Hello" + " " + "World"; ``` 然而,当需要进行大量字符串拼接操作时,使用"+"运算符会频繁创建新的字符串对象,导致性能下降。 2. 使用StringBuilder类:StringBuilder是Java提供的可变字符串类,它可以高效地进行字符串拼接。例如: ```java StringBuilder sb = new StringBuilder(); sb.append("Hello"); sb.append(" "); sb.append("World"); String str = sb.toString(); ``` 使用StringBuilder可以避免频繁创建新的字符串对象,从而提升性能。它适用于需要进行大量字符串拼接操作的场景。 3. 使用StringBuffer类:StringBuffer类与StringBuilder类相似,也是可变字符串类,可以高效地进行字符串拼接。然而,与StringBuilder不同的是,StringBuffer是线程安全的。例如: ```java StringBuffer sb = new StringBuffer(); sb.append("Hello"); sb.append(" "); sb.append("World"); String str = sb.toString(); ``` 如果在多线程环境下进行字符串拼接操作,可以选择使用StringBuffer。 综上所述,对于少量字符串拼接操作,可以使用"+"运算符;对于大量字符串拼接操作,建议使用StringBuilder;而在多线程环境下进行字符串拼接操作时,可以选择使用StringBuffer。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值