全面解釋java中StringBuilder、StringBuffer、String類之間的關系
1. String 類
String的值是不可變的,這就導致每次對String的操作都會生成新的String對象,不僅效率低下,而且大量浪費有限的內存空間。
String a = "a"; //假設a指向地址0x0001
a = "b";//重新賦值后a指向地址0x0002,但0x0001地址中保存的"a"依舊存在,但已經不再是a所指向的,a 已經指向了其它地址。
因此String的操作都是改變賦值地址而不是改變值操作。
2. StringBuffer是可變類,和線程安全的字符串操作類,任何對它指向的字符串的操作都不會產生新的對象。 每個StringBuffer對象都有一定的緩沖區容量,當字符串大小沒有超過容量時,不會分配新的容量,當字符串大小超過容量時,會自動增加容量。
StringBuffer buf=new StringBuffer(); //分配長16字節的字符緩沖區
StringBuffer buf=new StringBuffer(512); //分配長512字節的字符緩沖區
StringBuffer buf=new StringBuffer("this is a test")//在緩沖區中存放了字符串,并在后面預留了16字節的空緩沖區。
3.StringBuffer
StringBuffer和StringBuilder類功能基本相似,主要區別在于StringBuffer類的方法是多線程、安全的,而 StringBuilder不是線程安全的,相比而言,StringBuilder類會略微快一點。對于經常要改變值的字符串應該使用 StringBuffer和StringBuilder類。
4.線程安全
StringBuffer 線程安全
StringBuilder 線程不安全
5.速度
一般情況下,速度從快到慢:StringBuilder>StringBuffer>String,這種比較是相對的,不是絕對的。
6.總結
(1).如果要操作少量的數據用 = String
(2).單線程操作字符串緩沖區 下操作大量數據 = StringBuilder
(3).多線程操作字符串緩沖區 下操作大量數據 = StringBuffer