String、StringBuffer和StringBuilder
String类的对象其实是不可变的,因为在修改对象是创建新的对象,释放了原来的对象,而StringBuffer和StringBuilder类创建的对象是可变的,可以通过append()、insert()、reverse()…等方法来修改值。StringBuffer是线程安全的,而StringBuilder是线程非安全的。String添加数据的时候使用+,StringBuffer和StringBuilder添加数据是使用append(),三者的执行速度是:StringBuilder > StringBuffer > String。然后为了验证一下它们的执行速度添加一些数据比较一下。
首先定义一个String类赋值为空,然后定义一下开始时间获取System.currentTimeMillis()这个其实是返回1970年1月1日00:00:00到现在的毫秒数,不过是用来计算过程时间的这个就行了,用for循环添加i添加25000次,定义一个结束时间和开始时间一样的作用,在定义一个用来计算过程的时间,用结束时间减开始时间就得到过程用了多少毫秒,最后在输出一下过程时间。
StringBuffer、StringBuilder和String的过程完全一样,然后代码如下:
public static void main(String[] args) throws IOException {
//定义一个String
String str= "";
//定义开始时间
long StartTime = System.currentTimeMillis();
for (int i = 0; i < 25000; i++) {
str = str+i;
}
//定义结束时间
long EndTime = System.currentTimeMillis();
//定义一个过程时间
long ConsumeTime = EndTime-StartTime;
System.out.println("String:添加数据用了"+ConsumeTime+"毫秒");
//定义一个StringBuffer
StringBuffer buffer = new StringBuffer();
long StartTime1 = System.currentTimeMillis();
for (int i = 0; i < 25000; i++) {
buffer.append(i);
}
long EndTime1 = System.currentTimeMillis();
long ConsumeTime1 = EndTime1-StartTime1;
System.out.println("StringBuffer:添加数据用了"+ConsumeTime1+"毫秒");
//定义一个StringBuilder
StringBuilder builder = new StringBuilder();
long StartTime2 = System.currentTimeMillis();
for (int i = 0; i < 25000; i++) {
builder.append(i);
}
long EndTime2 = System.currentTimeMillis();
long ConsumeTime2 = EndTime2-StartTime2;
System.out.println("StringBuilder:添加数据用了"+ConsumeTime2+"毫秒");
}
结果截图:
通过截图可以用看到String添加数据比StringBuffer、StringBuilder添加数据耗时很多,所以要添加大量数据时最好选择StringBuffer和StringBuilder,线程安全选StringBuffer,线程不安全选StringBuilder。