您的位置:首页 > 产品设计 > UI/UE

String、StringBuffer和StringBuilder的区别

2017-11-11 21:54 267 查看
String 字符串常量,任何对String的改变都会引发新的String对象的生成。

StringBuffer 字符串变量(线程安全)支持并发操作,线程安全的,适合多线程中使用。

StringBuilder 字符串变量(非线程安全),不支持并发操作,线性不安全的,不适合多线程中使用,但其在单线程中的性能比StringBuffer高。

任何对StringBuffer和StringBuilder所指代的字符串的改变都不会产生新的对象。

接下来,我直接贴上测试过程和结果的代码,一目了然:

public class StringTest {

public static String BASEINFO = "Mr.Y";
public static final int COUNT = 2000000;

/**
* 执行一项String赋值测试
*/
public static void doStringTest() {

String str = new String(BASEINFO);
long starttime = System.currentTimeMillis();
for (int i = 0; i < COUNT / 100; i++) {
str = str + "miss";
}
long endtime = System.currentTimeMillis();
System.out.println((endtime - starttime)
+ " millis has costed when used String.");
}

/**
* 执行一项StringBuffer赋值测试
*/
public static void doStringBufferTest() {

StringBuffer sb = new StringBuffer(BASEINFO);
long starttime = System.currentTimeMillis();
for (int i = 0; i < COUNT; i++) {
sb = sb.append("miss");
}
long endtime = System.currentTimeMillis();
System.out.println((endtime - starttime)
+ " millis has costed when used StringBuffer.");
}

/**
* 执行一项StringBuilder赋值测试
*/
public static void doStringBuilderTest() {

StringBuilder sb = new StringBuilder(BASEINFO);
long starttime = System.currentTimeMillis();
for (int i = 0; i < COUNT; i++) {
sb = sb.append("miss");
}
long endtime = System.currentTimeMillis();
System.out.println((endtime - starttime)
+ " millis has costed when used StringBuilder.");
}

/**
* 测试StringBuffer遍历赋值结果
*
* @param mlist
*/
public static void doStringBufferListTest(List<String> mlist) {
StringBuffer sb = new StringBuffer();
long starttime = System.currentTimeMillis();
for (String string : mlist) {
sb.append(string);
}
long endtime = System.currentTimeMillis();
System.out.println(sb.toString() + "buffer cost:"
+ (endtime - starttime) + " millis");
}

/**
* 测试StringBuilder迭代赋值结果
*
* @param mlist
*/
public static void doStringBuilderListTest(List<String> mlist) {
StringBuilder sb = new StringBuilder();
long starttime = System.currentTimeMillis();
for (Iterator<String> iterator = mlist.iterator(); iterator.hasNext();) {
sb.append(iterator.next());
}

long endtime = System.currentTimeMillis();
System.out.println(sb.toString() + "builder cost:"
+ (endtime - starttime) + " millis");
}

public static void main(String[] args) {
doStringTest();
doStringBufferTest();
doStringBuilderTest();

List<String> list = new ArrayList<String>();
list.add(" I ");
list.add(" like ");
list.add(" BeiJing ");
list.add(" tian ");
list.add(" an ");
list.add(" men ");
list.add(" . ");

doStringBufferListTest(list);
doStringBuilderListTest(list);
}

}


运行结果:

620 millis has costed when used String.
64 millis has costed when used StringBuffer.
24 millis has costed when used StringBuilder.
I  like  BeiJing  tian  an  men  . buffer cost:1 millis
I  like  BeiJing  tian  an  men  . builder cost:0 millis


StringBuffer与StringBuilder常用方法
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息