區(qū)別
1,從運行速度上看:StringBuilder > StringBuffer > String
2,從長度上看:StringBuilder 和StringBuffer 是字符串變量,長度可變,String 創(chuàng)建后不可更改
3,從線程安全上看:StringBuilder是線程不安全的,StringBuffer是線程安全的?
4,使用區(qū)別
????當(dāng)操作String時,需要不斷創(chuàng)建和回收對象
????String 適合少量字符串操作情況
????StringBuffer:適用于多線程在字符緩沖區(qū)進行大量操作情況
????StringBuilder:適用于在單線程在字符緩沖區(qū)進行大量操作的情況
深入
引用:http://www.reibang.com/p/8fbd55d6e369
String 特點:
1.String不可繼承,支持序列化,支持自然排序
? ???String 是由final修飾的類,且實現(xiàn)了Serializable和Comparable接口
2.String底層實現(xiàn)用的final char[ ]
3.String可以采用直接賦值的形式進行操作,這一點像基本數(shù)據(jù)類型的賦值操作一樣语盈。范例:String str = "hello"舱馅;
4.String重寫了equals()方法,變成內(nèi)容的比較而不是地址
5.String類的設(shè)計使用了一個共享設(shè)計模式:?
????在JVM中刀荒,為了減少字符串對象的重復(fù)創(chuàng)建代嗤,維護了一塊特殊的內(nèi)存空間棘钞,這塊內(nèi)存就被稱為字符串常量池
6.字符串一旦創(chuàng)建,對他任何操作都不能改變
String a="abc"
????先去常量池中遍歷,如果有"abc"字符串,則直接返回當(dāng)前地址,如果沒有,則先在常量池中創(chuàng)建"abc",然后返回其地址,此過程創(chuàng)建零個或一個對象
String a=new String("abc"))
????先在池中遍歷,,如果有"abc"字符串,則進行下一步,如果沒有,則先在常量池中創(chuàng)建"abc",然后在堆中創(chuàng)建String對象,指向池中"abc"的地址,此過程創(chuàng)建一個或兩個對象,一定會創(chuàng)建對象
題目:
? ? String s1="abcd";? ? ? ? ? ? ? ? ? ? ? ? ? ?//在常量池創(chuàng)建"abcd"
????String s2="abcd";? ? ? ? ? ? ? ? ? ? ? ? ? ?//引用常量池中的"abcd"
????String s3=new String("abcd");? ? ? ? //堆中創(chuàng)建String對象 s3? 值指向常量池中的"abcd"
????String s4=new String("abcd");? ?????//堆中創(chuàng)建String對象 s4? 值指向常量池中的"abcd"
????System.out.println(s1==s2);????????//true
????System.out.println(s1==s3);? ????? //fallse
????System.out.println(s1==s4);????????//fallse
????System.out.println(s3==s4);????????//fallse