1. 程式人生 > >String,StringBuffer,StringBuilder的區別

String,StringBuffer,StringBuilder的區別

並不會 初始 jvm 小明 mce syn color turn 優點

  數據結構:

  數據結構是指相互之間存在一種或多種特定關系的數據元素的集合。

  比如數據庫就是對硬盤中的數據進行有規則的管理,可以進行增刪改查工作,而良好的數據結構可以優化這些操作,

  也許大家會想這些和String,StringBuffer,StringBuilder又有什麽樣的關系呢?是的,這裏裏面存在著關系:

  首先電腦存儲數據的地方有硬盤和內存條,硬盤的容量較大,並且是永久保存的(比如斷電後你電腦裏的下載的電影是不會消失的),

  但是硬盤的對數據的操作速度較慢;內存條的話容量小,並且是斷電後就會導致失去數據的(比如你電腦上開了一個軟件,電腦關機重

  啟後,軟件就關閉了),但是內存的對數據的操作速度快,所以CPU是直接和內存進行數據的交互的(硬盤上的數據得先讀取到內存 

  中,然後再被CPU進行讀取),我們的軟件就是被內存條讀取,然後CPU進行處理;

  如果我們在軟件中有一個良好的數據結構的話,就可以提高性能,而將這些對數據進行操作的代碼進行封裝的話就會形成一個個框架,

  而每個框架都有自己的優點和缺點,我們要靈活的運用,揚長避短,接下來切入主題。

  String,StringBuffer,StringBuilder(都是final類,不可繼承)這三個框架呢都可以對字符串進行操作,不同的是:

  String:

  String它是一個不能改變的量,比如

String name = new String("小明");//已經在內存中開辟了一塊空間並裝入了“小明”,再將name指向這個內存空間
name 
= "小星";//相當於重新開辟了一塊內存空間並裝入小星,然後再將name重新指向這個新的內存空間,最後jvm的GC會將原來的空間清除

  如果字符串反復修改的話,勢必會造成很大消耗。

  StringBuilder:

  java就推出了StringBuilder,這個類是一個可變量,當它初始化後,再對其數據進行修改,它會在原來開辟內存上進行修改,並不會重新開辟一塊空間

  但是這個類存在線程安全問題,要解決這個問題啊,於是StringBuffer站了出來.

  StringBuffer:

  它呢在他兄弟StringBuilder基礎上,使用synchronized解決了線程安全問題,但因為使用了synchronized會使性能降低,所以單線程中StringBuilder運行速度比

  StringBuffer快,我截取了StringBuffer類中的部分源代碼:

public synchronized int length() {
        return count;
    }

    public synchronized int capacity() {
        return value.length;
    }


    public synchronized void ensureCapacity(int minimumCapacity) {
        if (minimumCapacity > value.length) {
            expandCapacity(minimumCapacity);
        }
    }

    /**
     * @since      1.5
     */
    public synchronized void trimToSize() {
        super.trimToSize();
    }

  總結:

     1:如果是不太變化的字符串,可以使用String = XX(沒有new開辟空間,而是保存在常量池中);速度較快;

     2:單線程中,經常變動的字符串使用StringBuilder類更好;

     3:多線程中,經常變動的字符串使用StringBuffer類更好;

     可以查看詳細測試結果:http://blog.csdn.net/jessysong/article/details/54020668##1

String,StringBuffer,StringBuilder的區別