解決StringBuffer和StringBuilder的擴(kuò)容問(wèn)題
StringBuffer和StringBuilder的擴(kuò)容
以前對(duì)StringBuffer/StringBuilder只是初淺的了解,只是知道StringBuffer是線程安全的,Stringbuilder是非線程安全的。并且字符串長(zhǎng)度是可變的。
具體是怎么變沒(méi)有去深入了解,今天看了一下源碼,恍然大悟
來(lái)看一下源碼,在沒(méi)有傳參的情況下默認(rèn)初始容量是16。
有參數(shù)的情況下,初始容量是16+字符串的長(zhǎng)度,并且是用append()方法追加的字符。
到這里就有疑問(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)的。
忽然又想到一個(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;
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)行判斷
確定下需要的最小的容量(已經(jīng)存儲(chǔ)的數(shù)據(jù)長(zhǎng)度+準(zhǔn)備存儲(chǔ)的數(shù)據(jù)的長(zhǎng)度)是否大于存儲(chǔ)的char數(shù)組的長(zhǎng)度,如果大于就在newCapacity擴(kuò)容
判斷擴(kuò)容當(dāng)前char數(shù)組長(zhǎng)度的2倍+2的長(zhǎng)度是否滿足擴(kuò)容需求,不滿足設(shè)置為存儲(chǔ)的數(shù)據(jù)長(zhǎng)度+準(zhǔn)備存儲(chǔ)的數(shù)據(jù)的長(zhǎng)度,判斷append擴(kuò)容是否超過(guò)MAX_ARRAY_SIZE(Integer.MAX_VALUE - 8),如果是拋出異常OutOfMemoryError
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Gradle的安裝和IDEA集成、項(xiàng)目導(dǎo)入的詳細(xì)教程
這篇文章主要介紹了Gradle的安裝和IDEA集成、項(xiàng)目導(dǎo)入的詳細(xì)教程,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-08-08SpringBoot項(xiàng)目中同時(shí)操作多個(gè)數(shù)據(jù)庫(kù)的實(shí)現(xiàn)方法
在實(shí)際項(xiàng)目開(kāi)發(fā)中可能存在需要同時(shí)操作兩個(gè)數(shù)據(jù)庫(kù)的場(chǎng)景,本文主要介紹了SpringBoot項(xiàng)目中同時(shí)操作多個(gè)數(shù)據(jù)庫(kù)的實(shí)現(xiàn)方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03關(guān)于Java中修飾符的總結(jié)(fina除外)
下面小編就為大家?guī)?lái)一篇關(guān)于Java中修飾符的總結(jié)(fina除外)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-09-09Springboot JPA 枚舉Enum類型存入到數(shù)據(jù)庫(kù)的操作
這篇文章主要介紹了Springboot JPA 枚舉Enum類型存入到數(shù)據(jù)庫(kù)的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-01-01java發(fā)送http get請(qǐng)求的兩種方法(總結(jié))
下面小編就為大家?guī)?lái)一篇java發(fā)送http get請(qǐng)求的兩種方法(總結(jié))。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-05-05