欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

全面解釋java中StringBuilder、StringBuffer、String類之間的關(guān)系

 更新時(shí)間:2013年01月21日 08:54:01   作者:  
String的值是不可變的,這就導(dǎo)致每次對(duì)String的操作都會(huì)生成新的String對(duì)象,不僅效率低下,而且大量浪費(fèi)有限的內(nèi)存空間,StringBuffer是可變類,和線程安全的字符串操作類,任何對(duì)它指向的字符串的操作都不會(huì)產(chǎn)生新的對(duì)象,StringBuffer和StringBuilder類功能基本相似
1. String 類

  String的值是不可變的,這就導(dǎo)致每次對(duì)String的操作都會(huì)生成新的String對(duì)象,不僅效率低下,而且大量浪費(fèi)有限的內(nèi)存空間。
String a = "a"; //假設(shè)a指向地址0x0001
a = "b";//重新賦值后a指向地址0x0002,但0x0001地址中保存的"a"依舊存在,但已經(jīng)不再是a所指向的,a 已經(jīng)指向了其它地址。
因此String的操作都是改變賦值地址而不是改變值操作。

2. StringBuffer是可變類,和線程安全的字符串操作類,任何對(duì)它指向的字符串的操作都不會(huì)產(chǎn)生新的對(duì)象。 每個(gè)StringBuffer對(duì)象都有一定的緩沖區(qū)容量,當(dāng)字符串大小沒有超過容量時(shí),不會(huì)分配新的容量,當(dāng)字符串大小超過容量時(shí),會(huì)自動(dòng)增加容量。

StringBuffer buf=new StringBuffer(); //分配長16字節(jié)的字符緩沖區(qū)
StringBuffer buf=new StringBuffer(512); //分配長512字節(jié)的字符緩沖區(qū)
StringBuffer buf=new StringBuffer("this is a test")//在緩沖區(qū)中存放了字符串,并在后面預(yù)留了16字節(jié)的空緩沖區(qū)。

3.StringBuffer
  StringBuffer和StringBuilder類功能基本相似,主要區(qū)別在于StringBuffer類的方法是多線程、安全的,而StringBuilder不是線程安全的,相比而言,StringBuilder類會(huì)略微快一點(diǎn)。對(duì)于經(jīng)常要改變值的字符串應(yīng)該使用StringBuffer和StringBuilder類。

4.線程安全
StringBuffer 線程安全
StringBuilder 線程不安全

5.速度
一般情況下,速度從快到慢:StringBuilder>StringBuffer>String,這種比較是相對(duì)的,不是絕對(duì)的。

6.總結(jié)
(1).如果要操作少量的數(shù)據(jù)用 = String
(2).單線程操作字符串緩沖區(qū) 下操作大量數(shù)據(jù) = StringBuilder
(3).多線程操作字符串緩沖區(qū) 下操作大量數(shù)據(jù) = StringBuffer

以下是代碼與演示說明:

復(fù)制代碼 代碼如下:

public class TestCharacter {
final static int time = 50000; //循環(huán)次數(shù)

public TestCharacter(){

}
public void test(String s){
long begin = System.currentTimeMillis();
for(int i=0; i<time; i++){
s += “add”;
}
long over = System.currentTimeMillis();
System.out.println(“操作”+s.getClass().getName()+”類型使用的時(shí)間為:”+(over-begin)+”毫秒”);
}
public void test(StringBuffer s){
long begin = System.currentTimeMillis();
for(int i=0; i<time; i++){
s.append(“add”);
}
long over = System.currentTimeMillis();
System.out.println(“操作”+s.getClass().getCanonicalName()+”類型使用的時(shí)間為:”+(over-begin)+”毫秒”);
}
public void test(StringBuilder s){
long begin = System.currentTimeMillis();
for(int i=0; i<time; i++){
s.append(“add”);
}
long over = System.currentTimeMillis();
System.out.println(“操作”+s.getClass().getName()+”類型使用的時(shí)間為:”+(over-begin)+”毫秒”);
}

/*對(duì) String 直接進(jìn)行字符串拼接的測(cè)試*/
public void test2(){
String s2 = “abcd”;
long begin = System.currentTimeMillis();
for(int i=0; i<time; i++){
String s = s2 + s2 +s2;
}
long over = System.currentTimeMillis();
System.out.println(“操作字符串對(duì)象引用相加類型使用的時(shí)間為:”+(over-begin)+”毫秒”);
}
public void test3(){
long begin = System.currentTimeMillis();
for(int i=0; i<time; i++){
String s =”abcd” + “abcd” + “abcd”;
}
long over = System.currentTimeMillis();
System.out.println(“操作字符串相加使用的時(shí)間為:”+(over-begin)+”毫秒”);
}
public static void main(String[] args){
String s1 = “abcd”;
StringBuffer st1 = new StringBuffer(“abcd”);
StringBuilder st2 = new StringBuilder(“abcd”);
TestCharacter tc = new TestCharacter();
tc.test(s1);
tc.test(st1);
tc.test(st2);
tc.test2();
tc.test3();
}
}

我在myeclipse和dos下都運(yùn)行了這段代碼,各自打印出的時(shí)間有些不同,運(yùn)行結(jié)果如下:
1)myeclipse下循環(huán)10000次時(shí):

2)myeclipse下循環(huán)50000次時(shí):

3)在DOS下運(yùn)行時(shí):

相關(guān)文章

最新評(píng)論