亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

解決StringBuffer和StringBuilder的擴(kuò)容問題

 更新時(shí)間:2021年07月14日 11:04:23   作者:正兒八經(jīng)的胡說八道  
這篇文章主要介紹了解決StringBuffer和StringBuilder的擴(kuò)容問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

StringBuffer和StringBuilder的擴(kuò)容

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

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

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

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

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

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

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

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

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

newCapacity = minCapacity;

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

StringBuilder默認(rèn)的創(chuàng)建的時(shí)候開辟的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)行判斷

StringBuilder.append

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

ensureCapacityInternal

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

newCapacity

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

最新評(píng)論