Java字符串拼接之String、StringBuffer和StringBuilder的性能

Java字符串拼接之String、StringBuffer和StringBuilder的性能

作者:谢景,撰写:2019-4-16

在c#中,字符串拼接是利用+号运算符重载实现的,但是在Java中虽然+号运算符也能实现字符串拼接,但是性能差。
下面介绍一下关于字符的相关的类。

  • String 类对象不可变,一旦修改 String的值就是隐形的重建了一个新的对象,释 放了原 String对象
例如:String str=str+"a";
相当于  先声明一个新的String:String str1=new String(str+"a");
       然后再将新的String赋值给旧的str:str=str1;
  • StringBuffer和StringBuilder类是可以通过append()、insert()、reverse()…等方法 来修改值。创建的对象是可变
  • StringBuffer:线程安全的; StringBuilder:线程非安全的
  • 字符串连接 String 的 + 比 StringBuffer(StringBuilder) 的 Append() 性能差了很多
  • 三者在执行速度方面的比较:StringBuilder > StringBuffer > String

下面通过代码实践来验证一下上面的结论:

public static void ddd(){	
	//-----------------String-----------------------
	String string=new String("");
	Date date=new Date();//循环前声明一个实例化当前时间
	for (int i = 0; i < 10000; i++) {
		string+="1";
	}
	Date date1=new Date();//循环后声明再一个实例化当前时间
	//获取后面的时间减去前面的时间的值
	System.out.println("String: "+(date1.getTime()-date.getTime()));
	//-----------------StringBuffer-----------------------
	StringBuffer buffer=new StringBuffer("");
	Date date2=new Date();//循环前声明一个实例化当前时间
	for (int i = 0; i < 10000; i++) {
		buffer.append("1");//StringBuffer、StringBuilder不能用+号运算符拼接字符
	}
	Date date3=new Date();//循环后声明再一个实例化当前时间
	//获取后面的时间减去前面的时间的值
	System.out.println("StringBuffer: "+(date3.getTime()-date2.getTime()));
}

结果如下图:
Java字符串拼接之String、StringBuffer和StringBuilder的性能_第1张图片
上图证明StringBuffer 比String拼接字符执行速度快很多,
又因为 StringBuffer:线程安全的; StringBuilder:线程非安全的
线程安全是已消耗速率为代价的,由此可以证明:
三者在执行速度方面的比较:StringBuilder > StringBuffer > String

你可能感兴趣的:(Java)