String、StringBuilder和StringBuffer的区别和用法
分别使用使用这三种来拼接字符串,对比各自损耗的时间:
经过测试:
package com.test;
public class Main{
public static void main(String[] args){
testString();
testStringBuffer();
testStringBuilder();
}
private static void testStringBuilder() {
long begin = System.currentTimeMillis();
StringBuilder str = new StringBuilder("");
for (int i = 0; i < 30000; i++) {
str.append(i);
}
long end = System.currentTimeMillis();
long time = end - begin;
System.out.println("-------------StringBuilder性能快--------------");
System.out.println(time);
}
private static void testStringBuffer() {
long begin = System.currentTimeMillis();
StringBuffer str = new StringBuffer("");
for (int i = 0; i < 30000; i++) {
str.append(i);
}
long end = System.currentTimeMillis();
long time = end - begin;
System.out.println("------------StringBuffer安全的---------------");
System.out.println(time);
}
//String 做做字符串拼接的时候,性能极低,每次拼接的时候对象改变
public static void testString(){
long begin = System.currentTimeMillis();
String str = "";
/* for (int i = 0; i < 30000; i++) {
str += i;
}*/
for(Integer i =0; i< 30000; i++){
str += i.toString();
}
long end = System.currentTimeMillis();
long time = end - begin;
System.out.println("-----------String----------------");
System.out.println(time);
}
}
结论:以后拼接字符串,统统使用StringBuffer/StringBuilder,不要使用String。
String和StringBuilder以及StringBuffer的区别:
StringBuffer和StringBuilder都表示可变的字符串,功能方法都是相同的。
唯一的区别(建议使用StringBuilder):
StringBuffer:StringBuffer中的方法都使用synchronized修饰符,表示同步的在多线程并发的时候可以保证线程安全,保证线程安全的时候,性能(速度)较低。
StringBuilder:StringBuilder没有使用synchronized修饰符,不安全,但性能高。
StringBuilder sb = new StringBuilder ()等价于…new StringBuilder(16)(API可见..) 使用StringBUilder无参数的构造器,在底层创建一个长度为16的char数组:
char[] value = new char[16];
此时该数组只能存储16字符,如果超过了,得自动扩容:
自动扩容(创建长度更大得数组,再把之前得数组拷贝到新数组)
此时性能极低,一般得,我们事先知道大概需要存储多少字符,在构造器中就应该设置。