String--StringBuffer-StringBuilder区别

package mDemo;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class Test1 {
/*
String:字符串常量
    StringBuffer:字符串变量---线程安全的
    StringBuilder:字符串变量---线程非安全的
* */

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

public static void main(String[] args) {
String s = "abcd";
s = s+1;
System.out.println(s);// result : abcd1

doStringTest();
doStringBufferTest();
doStringBuilderTest();
//不考虑多线程,采用String对象时(我把Count/100),执行时间比其他两个都要高,而采用StringBuffer对象和采用StringBuilder对象的差别也比较明显。
//由此可见,如果我们的程序是在单线程下运行,或者是不必考虑到线程同步问题,我们应该优先使用StringBuilder类;如果要保证线程安全,自然是StringBuffer。

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);
//从后面List的测试结果可以看出,除了对多线程的支持不一样外,这两个类的使用方式和结果几乎没有任何差别,

stringBufferMethods();//stringBuffer常用方法
}

/**
* 执行一项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."); //526millis
}

/**
* 执行一项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."); //62millis
}

/**
* 执行一项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."); //16millis
}

/**
* 测试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"); //0millis
}

/**
* 测试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"); //0millis
}

/**
* 执行一项StringBuilder常用方法
*/
public static void stringBufferMethods() {
//这样初始化出的StringBuffer对象是一个空的对象
StringBuffer s = new StringBuffer();
//分配了长度512字节的字符缓冲区
StringBuffer sb1=new StringBuffer(512);
//创建带有内容的StringBuffer对象,在字符缓冲区中存放字符串“how are you?”
StringBuffer sb2=new StringBuffer("how are you?");
//添加字符串
sb2.append(true);//how are you?true
//删除,按下标删除,从0开始
sb2.deleteCharAt(1);//hw are you?true
//删除,按下标删除,包含start,不包含end索引值的区间
sb2.delete(1, 3);//hare you?true
//根据下标插入
sb2.insert(4,false);//harefalse you?true

StringBuffer sb = new StringBuffer("abc");
//反转
sb.reverse();//cba
//替换值
sb.setCharAt(1, 'D');//cDa
//trimToSize()---将StringBuffer对象的中存储空间缩小到和字符串长度一样的长度,减少空间的浪费,和String的trim()是一样的作用
}
}

posted @ 2016-11-10 09:34  追恋KG  阅读(173)  评论(0编辑  收藏  举报