2017-09-06 82 views
2

我試圖弄清楚何時使用或爲什麼capacity()方法不同於length()方法的StringBuilderStringBuffer類。StringBuilder中的length()和capacity()方法之間的區別

我已經搜索堆棧溢出,並設法拿出this的答案,但我不明白它與length()方法的區別。我也訪問過this網站,但這對我來說幫助更少。

+0

'length()'是當前有多少東西在裏面。 'cacacity()'是它目前有多少空間。 – khelwood

回答

5

StringBuilder是建立文本。在內部,它使用一組字符來存放您添加到其中的文本。 capacity是數組的大小。 length是該數組中多少數據當前由應該使用的文本填充。因此,與:

StringBuilder sb = new StringBuilder(1000); 
sb.append("testing"); 

capacity()是1000(有空間用於1000個字符需要用較大的一個被替換的內部陣列之前),和length()是7(有陣列在七個有意義字符)。

的能力是非常重要的,因爲如果你嘗試更多的文本添加到StringBuilder比它有能力,它分配一個新的,更大的緩存和複製內容到它,它有內存使用和性能的影響*。例如,StringBuilder的默認容量是目前16個字符(它不記錄,並可以改變),所以:

StringBuilder sb = new StringBuilder(); 
sb.append("Singing:"); 
sb.append("I am the very model of a modern Major General"); 

...創建StringBuilder與​​,副本"Singing:"成數組,那麼必須創建一個新的數組,並在它添加第二個字符串之前將內容複製到它,因爲它沒有足夠的空間來添加第二個字符串。


* (無論是否重要取決於什麼代碼做)

3

字符串的長度總是小於或等於製造商的能力。長度爲構建器中存儲的字符串的實際大小,容量爲最大大小,它目前可以適用。

如果添加更多字符以超過其容量,構建器的容量會自動增加。在內部,字符串構建器是一個字符數組,因此構建器的容量是數組的大小。如果超出構建器的容量,則該數組將被一個新數組替換。新的數組大小爲2 * (the previous array size + 1)

既然你是新的Java的,我建議你這個技巧也有關的StringBuilder的效率:

您可以使用newStringBuilder(initialCapacity)創建具有指定初始容量StringBuilder的。通過仔細選擇初始容量,可以使您的程序更高效。如果容量始終大於構建器的實際長度,則JVM將永遠不需要爲構建器重新分配內存。另一方面,如果容量太大,則會浪費存儲空間。您可以使用trimToSize()方法將容量減小到實際大小。

我試圖解釋一下我能做到的最好的條件,所以我希望它有幫助。

+0

Thanks @ mandy8055此答案也有幫助 – NiruADV

+0

Sir(@tripleee)有充分的尊重,我想問一下你對我的回答所做的修改(編輯是好的),你把**當前的大小**改爲**最大尺寸**?它可以增加是不是所以**目前**是不錯的選擇? – Mandy8055

+0

我認爲這是一個有用的說明,但如果你不同意並已經改變它,那對我來說完全沒問題。對我而言,「實際尺寸」和「當前尺寸」在這種情況下似乎是事實上的同義詞。也許「目前適合的最大尺寸」將是一個合理的妥協?有些無端的粗暴表情也可能會讓我失望。 – tripleee

相關問題