java中String StringBuffer

StringBuffer和StringBuilder的區別是StringBuffer是線程安全的,StringBuilder則不是,因此當不考慮線程安全的時候,StringBuilder效率更高。java

我的理解,水平不夠,還請指正。數組


一、CharSequence安全

String實現了三個接口,其中一個是CharSequence,StringBuilder和StringBuffer也都實現了這個接口函數


CharSequence接口中有這些東西:ui

int length();//返回char序列的長度,即有多少個字符在這個序列中spa

char charAt(int index);//返回特定位置的字符,從0到length()-1線程

CharSequence subSequence(int start, int end);//返回子序列,從0到length()-1code

public String toString();//返回與char序列一樣字符順序的String對象對象


有些函數就會以CharSequence做爲參數,能夠將String,StringBuffer,StringBuilder做爲參數參入。繼承


二、String StringBuffer的屬性

1.1String屬性

private final char value[];//用於字符存儲,是final類型的


String str = "abc";

至關於

char data[] = {'a', 'b', 'c'};

String str = new String(data);


String的構造函數會初始化value數組,一旦初始化就不能改變了。

因此若是str = "def";只是改變了str的引用,變爲"def"字符串的引用了。"abc"、"def"是兩個堆區中的對象。


1.2StringBuffer屬性

StringBuffer繼承於AbstractStringBuilder

AbstractStringBuilder中的屬性有

char[] value;

int count;


能夠看到StringBuffer中的這裏的value不是final的。

在任什麼時候間點都有一個特有的字符序列,其長度和內容能夠經過StringBuffer中的方法改變。


下面具體看看StringBuffer的方法。

length()獲得是有多少個字符。

public int length() {
        return count;
}

capacity()獲得是value數組分配的長度

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


當新分配的容量比原來的capacity大時,會進行擴容

這個expandCapacity方法並無進行大小檢查和同步處理,其餘方法在調用時須要先作判斷


/**

     * This implements the expansion semantics of ensureCapacity with no

     * size check or synchronization.

     */


void expandCapacity(int minimumCapacity) {
        int newCapacity = value.length * 2 + 2;
        if (newCapacity - minimumCapacity < 0)
            newCapacity = minimumCapacity;
            
        //這個地方的判斷沒看懂,什麼狀況下會<0
        if (newCapacity < 0) {
            if (minimumCapacity < 0) // overflow
                throw new OutOfMemoryError();
            newCapacity = Integer.MAX_VALUE;
        }
        value = Arrays.copyOf(value, newCapacity);
    }

Arrays.copyOf(value, newCapacity)

public static char[] copyOf(char[] original, int newLength) {
       char[] copy = new char[newLength];
       System.arraycopy(original, 0, copy, 0,
                        Math.min(original.length, newLength));
       return copy;
   }

System.arraycopy

public static native void arraycopy(Object src,  int  srcPos,
                                       Object dest, int destPos,
                                       int length);

最後經過System.arraycopy來進行數組擴充內容,由於這個函數是native的,效率比較高


未完。。

相關文章
相關標籤/搜索