1. 程式人生 > >String和stringbuffer

String和stringbuffer

args 不同 abcd insert 字體位置 避免 類型 ava col

 很多人都會認為,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