String和stringbuffer
很多人都會認為,String和StringBuffer沒有多大的區別,但是String與StringBuffer的區別,就是一個變量和常量的關系。
StringBuffer對象的內容可以修改;而String對象一旦產生後就不可以被修改,重新賦值就是兩個對象。
StringBuffer 的內部實現方式和String不同,StringBuffer在進行字符串處理時,不生成新的對象,在內存使用上要優於String類。所以在實際使用時,如果經常需要對一個字符串進行修改,使用StringBuffer要更加適合一些。
在String類中沒有用來改變已有字符串中的某個字符的方法,由於不能改變一個java字符串中的某個單獨字符,所以在JDK文檔中稱String類的對象是不可改變的。然而,不可改變的字符串具有一個很大的優點:編譯器可以把字符串設為共享的
StringBuffer 類屬於一種輔助類,可預先分配指定長度的內存塊建立一個字符串緩沖區。這樣使用StringBuffer類的append方法追加字符 比 String使用 + 操作符添加字符 到 一個已經存在的字符串後面有效率得多。
因為使用 + 操作符每一次將字符添加到一個字符串中去時,字符串對象都需要尋找一個新的內存空間來容納更大的字符串,這是一個非常消耗時間的操作。添加多個字符也 就意味著要一次又一次的對字符串重新分配內存。使用StringBuffer類就避免了這個問題。
StringBuffer是線程安全的,在多線程程序中也可以很方便的進行使用,但是程序的執行效率相對來說就要稍微慢一些。
下面就舉一個例子來說明一下
public static void main(String[] args) throws Exception{ String str=new String(); long start=System.currentTimeMillis(); for(int i=0;i<50000;i++){ str+=i+""; } long end=System.currentTimeMillis(); System.out.println(end-start); StringBuffer strbuf=new StringBuffer(); start=System.currentTimeMillis(); for(int i=0;i<50000;i++){ strbuf.append(i+""); } end=System.currentTimeMillis(); System.out.println(end-start); }
所用時間
9216 8
這可以看出stringbuffer的速度
但是,看上一個例子紅色字體位置,我所用的string是每次添加不同的值,如果每次添加相同的值,因為棧內存中已經存在共享值,所以string不再創建新的內存,直接引用
public static void main(String[] args) throws Exception{ String str=new String(); long start=System.currentTimeMillis(); for(int i=0;i<50000;i++){ str="abc"; } long end=System.currentTimeMillis(); System.out.println(end-start); StringBuffer strbuf=new StringBuffer(); start=System.currentTimeMillis(); for(int i=0;i<50000;i++){ strbuf=new StringBuffer("abc"); } end=System.currentTimeMillis(); System.out.println(end-start); }
0 5
這就是string的棧內存
StringBuffer常用方法:
1. append(str); 添加
StringBudder strBuf=new StringBuffer("a");
strBuf.append("bcdefghi");
結果:bcdefghi
2.deleteCharAt(int index); 刪除第幾個字節
strBuf.append("abcdefghi");
strBuf.deleteCharAt(0);
結果:bcdefghi
3.delete(int start,int end);刪除從第幾個到第幾個
strBuf.append("abcdefghi");
strBuf.delete(1,3);
結果:adefghi
4.insert(int index,str);在什麽位置添加什麽內容
strBuf.append("abcdefghi");
strBuf.insert(1,"A");
結果:aAdefghi
5.reverse()將字段反轉
strBuf.append("abc");
strBuf.reverse();
結果:cba
6.setCharAt(int index,char char) 修改字段
註意 只能用char類型
strBuf.append("abc");
strBuf.setCharAt(1,‘B’);
結果:aBc
7.trimToSize() 字符個數
和size()相同 只不過這種可以節省空間
朱星翰
String和stringbuffer