String,StringBuffer,StringBuilder的區別
數據結構:
數據結構是指相互之間存在一種或多種特定關系的數據元素的集合。
比如數據庫就是對硬盤中的數據進行有規則的管理,可以進行增刪改查工作,而良好的數據結構可以優化這些操作,
也許大家會想這些和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的區別