欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

StringBuffer和StringBuilder的擴(kuò)容

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

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

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

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

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

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

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

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

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

newCapacity = minCapacity;

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

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

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

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

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

StringBuilder.append

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

ensureCapacityInternal

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

newCapacity

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

相關(guān)文章

  • java實現(xiàn)猜數(shù)字游戲

    java實現(xiàn)猜數(shù)字游戲

    這篇文章主要為大家詳細(xì)介紹了java實現(xiàn)猜數(shù)字游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-05-05
  • Gradle的安裝和IDEA集成、項目導(dǎo)入的詳細(xì)教程

    Gradle的安裝和IDEA集成、項目導(dǎo)入的詳細(xì)教程

    這篇文章主要介紹了Gradle的安裝和IDEA集成、項目導(dǎo)入的詳細(xì)教程,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-08-08
  • SpringBoot項目中同時操作多個數(shù)據(jù)庫的實現(xiàn)方法

    SpringBoot項目中同時操作多個數(shù)據(jù)庫的實現(xiàn)方法

    在實際項目開發(fā)中可能存在需要同時操作兩個數(shù)據(jù)庫的場景,本文主要介紹了SpringBoot項目中同時操作多個數(shù)據(jù)庫的實現(xiàn)方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • JVM之內(nèi)存分配和回收機(jī)制

    JVM之內(nèi)存分配和回收機(jī)制

    本篇主要介紹JVM內(nèi)存分配和回收策略,內(nèi)容主要節(jié)選自《深入理解java虛擬機(jī)》,需要的朋友可以參考下
    2023-05-05
  • 關(guān)于Java中修飾符的總結(jié)(fina除外)

    關(guān)于Java中修飾符的總結(jié)(fina除外)

    下面小編就為大家?guī)硪黄P(guān)于Java中修飾符的總結(jié)(fina除外)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-09-09
  • 一招教你優(yōu)化Java代碼中大量的if/else

    一招教你優(yōu)化Java代碼中大量的if/else

    當(dāng)代碼已經(jīng)復(fù)雜到難以維護(hù)的程度之后,只能狠下心重構(gòu)優(yōu)化。那,有什么方案可以優(yōu)雅的優(yōu)化掉這些多余的if/else?本文就來和大家詳細(xì)聊聊
    2023-03-03
  • Springboot JPA 枚舉Enum類型存入到數(shù)據(jù)庫的操作

    Springboot JPA 枚舉Enum類型存入到數(shù)據(jù)庫的操作

    這篇文章主要介紹了Springboot JPA 枚舉Enum類型存入到數(shù)據(jù)庫的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-01-01
  • 理解java中的深復(fù)制和淺復(fù)制

    理解java中的深復(fù)制和淺復(fù)制

    這篇文章主要幫助大家理解java中的深復(fù)制和淺復(fù)制,對java中的深復(fù)制和淺復(fù)制進(jìn)行剖析,感興趣的小伙伴們可以參考一下
    2016-02-02
  • java類加載相關(guān)知識總結(jié)

    java類加載相關(guān)知識總結(jié)

    今天帶大家復(fù)習(xí)Java基礎(chǔ)知識,文章對Java類加載做了詳細(xì)介紹,對正在學(xué)習(xí)java的小伙伴很有幫助,需要的朋友可以參考下
    2021-05-05
  • java發(fā)送http get請求的兩種方法(總結(jié))

    java發(fā)送http get請求的兩種方法(總結(jié))

    下面小編就為大家?guī)硪黄猨ava發(fā)送http get請求的兩種方法(總結(jié))。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-05-05

最新評論