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()));
}
结果如下图:
上图证明StringBuffer 比String拼接字符执行速度快很多,
又因为 StringBuffer:线程安全的; StringBuilder:线程非安全的
线程安全是已消耗速率为代价的,由此可以证明:
三者在执行速度方面的比较:StringBuilder > StringBuffer > String