String和StringBuffer的區別

JAVA平臺提供了兩個類:String和StringBuffer,它們可以儲存和操作字符串,即包含多個字符的字符數據。這個String類提供了數值不可改變的字符串。而這個StringBuffer類提供的字符串進行修改。當你知道字符數據要改變的時候你就可以使用StringBuffer。典型地,你可以使用 StringBuffers來動態構造字符數據。 String對象相當於一個常量,一旦產生後就不可以修改,重新賦值其實就是兩個對象。String是對象,不是原始類型。**爲不可變對象,一旦被創建,就不能修改它的值**。對於已經存在的String對象的修改都是重新創建一個新的對象,然後把新的值保存進去。String是final類,不能被繼承。 StringBuffer只要沒有重新new, 則始終是同一個對象。StringBuffer是一個可變的對象,當對它進行修改時不會像String那樣重新建立對象,它只能根據構造函數來建立StringBuffer sb=new StringBuffer(); 不能通過賦值符號對StringBuffer進行賦值, sb="welcome to here"//error StringBuffer對象建立後,在內存中就會分配空間,並初始化爲null,向StringBuffer中賦值的時候可以通過它的append方法。sb.append("hello"); 字符串的連接操作中StringBuffer的效率要比String高;String str=new String("welcometo");str+="here"; 因爲String對象是不可變對象,每次操作String都會重新建立新的對象來保存新的值。這樣原來的對象就沒用了,就要被垃圾回收。 三者在執行速度方面的比較:StringBuilder > StringBuffer > String 1.如果要操作少量的數據用 = String  2.單線程操作字符串緩衝區 下操作大量數據 = StringBuilder         3.多線程操作字符串緩衝區 下操作大量數據 = StringBuffer

測試代碼如下:
package com.yc.String;


public class Test {


public static void main(String[] args) {
String str="a";
StringBuffer sb=new StringBuffer("a");
// process(str);//a
// System.out.println(str); //a

process(sb);
System.out.println(sb);
// process(str,sb);
// System.out.println("str:"+str);//a
// System.out.println("sb:"+sb);//aA
}


private static void process(String str, StringBuffer sb) {
System.out.println(str);//a
str=new String("A");//改變的是局部變量的值
sb.append("A");//不僅改變了局部變量的值   還改變了原來的全局變量的值
System.out.println("method str:"+str);//A
System.out.println("method sb:"+sb);//aA  因爲StringBuffer沒有重新new 所以這次改變還是在之前的sb之上

}


private static void process(String str) {
str="A";//改變的是局部變量的值
System.out.println("str:"+str);//str:A
}

private static void process(StringBuffer sb) {
sb=new StringBuffer();
sb.append("A");
System.out.println(sb);
}


/**

* String  不管有沒有new  都不是是同一個String
* String對象相當於一個常量,一旦產生後就不可以修改,重新賦值其實就是兩個對象
* String是對象  不是原始類型
* 爲不可變對象,一旦被創建,就不能修改它的值
* 對於已經存在的String對象的修改都是重新創建一個新的對象,然後把新的值保存進去
* String是final類 不能被繼承

* StringBuffer 只要沒有重新new  則始終是同一個 
* StringBuffer 是一個可變對象,當對他進行修改時不會像String那樣重新建立對象,它只能根據構造函數來建立
*  StringBuffer sb=new StringBuffer();
*   


*/
}
發佈了24 篇原創文章 · 獲贊 21 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章