溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

如何解決StringBuffer和StringBuilder的擴(kuò)容問(wèn)題

發(fā)布時(shí)間:2021-07-14 13:45:08 來(lái)源:億速云 閱讀:171 作者:chen 欄目:開(kāi)發(fā)技術(shù)

這篇文章主要講解了“如何解決StringBuffer和StringBuilder的擴(kuò)容問(wèn)題”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來(lái)研究和學(xué)習(xí)“如何解決StringBuffer和StringBuilder的擴(kuò)容問(wèn)題”吧!

StringBuffer和StringBuilder的擴(kuò)容

以前對(duì)StringBuffer/StringBuilder只是初淺的了解,只是知道StringBuffer是線程安全的,Stringbuilder是非線程安全的。并且字符串長(zhǎng)度是可變的。

具體是怎么變沒(méi)有去深入了解,今天看了一下源碼,恍然大悟

來(lái)看一下源碼,在沒(méi)有傳參的情況下默認(rèn)初始容量是16。

如何解決StringBuffer和StringBuilder的擴(kuò)容問(wèn)題

有參數(shù)的情況下,初始容量是16+字符串的長(zhǎng)度,并且是用append()方法追加的字符。

如何解決StringBuffer和StringBuilder的擴(kuò)容問(wèn)題

到這里就有疑問(wèn)那,那這個(gè)字符串的長(zhǎng)度是多少呢。是它本身的長(zhǎng)度還是16+它自身的長(zhǎng)度,來(lái)接著往下看。一路追尋append()方法終于找到答案了。

注意,這個(gè)len居然是String自身的長(zhǎng)度,現(xiàn)在明白了吧。其實(shí)平時(shí)咱們也在用str.length();方法就是沒(méi)注意它的長(zhǎng)度是怎么來(lái)的。

如何解決StringBuffer和StringBuilder的擴(kuò)容問(wèn)題

忽然又想到一個(gè)問(wèn)題,那要是在追加字符串的時(shí)候長(zhǎng)度比16大怎么辦,我們看到有個(gè)ensureCapacityInternal()的方法,追進(jìn)去看看,然后發(fā)現(xiàn)它是這么擴(kuò)容的

int newCapacity = (value.length << 1) + 2;

增加為自身長(zhǎng)度的一倍然后再加2;這個(gè)時(shí)候如果還是放不下,那就直接擴(kuò)容到它需要的長(zhǎng)度

newCapacity = minCapacity;

如何解決StringBuffer和StringBuilder的擴(kuò)容問(wèn)題

如何解決StringBuffer和StringBuilder的擴(kuò)容問(wèn)題

如何解決StringBuffer和StringBuilder的擴(kuò)容問(wèn)題

StringBuilder擴(kuò)容規(guī)則

StringBuilder默認(rèn)的創(chuàng)建的時(shí)候開(kāi)辟的char數(shù)組的大小

StringBuilder() default 16
StringBuilder("Str") default Str.length()+16

StringBuilder sb擴(kuò)容的規(guī)則:

當(dāng)調(diào)用sb.append()的時(shí)候每次都會(huì)對(duì)當(dāng)前容量進(jìn)行判斷

如何解決StringBuffer和StringBuilder的擴(kuò)容問(wèn)題

確定下需要的最小的容量(已經(jīng)存儲(chǔ)的數(shù)據(jù)長(zhǎng)度+準(zhǔn)備存儲(chǔ)的數(shù)據(jù)的長(zhǎng)度)是否大于存儲(chǔ)的char數(shù)組的長(zhǎng)度,如果大于就在newCapacity擴(kuò)容

如何解決StringBuffer和StringBuilder的擴(kuò)容問(wèn)題

判斷擴(kuò)容當(dāng)前char數(shù)組長(zhǎng)度的2倍+2的長(zhǎng)度是否滿(mǎn)足擴(kuò)容需求,不滿(mǎn)足設(shè)置為存儲(chǔ)的數(shù)據(jù)長(zhǎng)度+準(zhǔn)備存儲(chǔ)的數(shù)據(jù)的長(zhǎng)度,判斷append擴(kuò)容是否超過(guò)MAX_ARRAY_SIZE(Integer.MAX_VALUE - 8),如果是拋出異常OutOfMemoryError

如何解決StringBuffer和StringBuilder的擴(kuò)容問(wèn)題

感謝各位的閱讀,以上就是“如何解決StringBuffer和StringBuilder的擴(kuò)容問(wèn)題”的內(nèi)容了,經(jīng)過(guò)本文的學(xué)習(xí)后,相信大家對(duì)如何解決StringBuffer和StringBuilder的擴(kuò)容問(wèn)題這一問(wèn)題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是億速云,小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI