一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務(wù)器之家 - 編程語言 - Java教程 - 解決StringBuffer和StringBuilder的擴容問題

解決StringBuffer和StringBuilder的擴容問題

2021-10-08 10:31正兒八經(jīng)的胡說八道 Java教程

這篇文章主要介紹了解決StringBuffer和StringBuilder的擴容問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

StringBuffer和StringBuilder的擴容

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

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

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

解決StringBuffer和StringBuilder的擴容問題

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

解決StringBuffer和StringBuilder的擴容問題

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

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

解決StringBuffer和StringBuilder的擴容問題

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

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

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

  1. newCapacity = minCapacity;

解決StringBuffer和StringBuilder的擴容問題

解決StringBuffer和StringBuilder的擴容問題

解決StringBuffer和StringBuilder的擴容問題

StringBuilder擴容規(guī)則

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

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

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

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

解決StringBuffer和StringBuilder的擴容問題

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

解決StringBuffer和StringBuilder的擴容問題

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

解決StringBuffer和StringBuilder的擴容問題

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

原文鏈接:https://blog.csdn.net/weixin_43958556/article/details/114748674

延伸 · 閱讀

精彩推薦
  • Java教程xml與Java對象的轉(zhuǎn)換詳解

    xml與Java對象的轉(zhuǎn)換詳解

    這篇文章主要介紹了xml與Java對象的轉(zhuǎn)換詳解的相關(guān)資料,需要的朋友可以參考下...

    Java教程網(wǎng)2942020-09-17
  • Java教程升級IDEA后Lombok不能使用的解決方法

    升級IDEA后Lombok不能使用的解決方法

    最近看到提示IDEA提示升級,尋思已經(jīng)有好久沒有升過級了。升級完畢重啟之后,突然發(fā)現(xiàn)好多錯誤,本文就來介紹一下如何解決,感興趣的可以了解一下...

    程序猿DD9332021-10-08
  • Java教程Java8中Stream使用的一個注意事項

    Java8中Stream使用的一個注意事項

    最近在工作中發(fā)現(xiàn)了對于集合操作轉(zhuǎn)換的神器,java8新特性 stream,但在使用中遇到了一個非常重要的注意點,所以這篇文章主要給大家介紹了關(guān)于Java8中S...

    阿杜7472021-02-04
  • Java教程Java BufferWriter寫文件寫不進去或缺失數(shù)據(jù)的解決

    Java BufferWriter寫文件寫不進去或缺失數(shù)據(jù)的解決

    這篇文章主要介紹了Java BufferWriter寫文件寫不進去或缺失數(shù)據(jù)的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望...

    spcoder14552021-10-18
  • Java教程小米推送Java代碼

    小米推送Java代碼

    今天小編就為大家分享一篇關(guān)于小米推送Java代碼,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧...

    富貴穩(wěn)中求8032021-07-12
  • Java教程Java使用SAX解析xml的示例

    Java使用SAX解析xml的示例

    這篇文章主要介紹了Java使用SAX解析xml的示例,幫助大家更好的理解和學(xué)習(xí)使用Java,感興趣的朋友可以了解下...

    大行者10067412021-08-30
  • Java教程20個非常實用的Java程序代碼片段

    20個非常實用的Java程序代碼片段

    這篇文章主要為大家分享了20個非常實用的Java程序片段,對java開發(fā)項目有所幫助,感興趣的小伙伴們可以參考一下 ...

    lijiao5352020-04-06
  • Java教程Java實現(xiàn)搶紅包功能

    Java實現(xiàn)搶紅包功能

    這篇文章主要為大家詳細介紹了Java實現(xiàn)搶紅包功能,采用多線程模擬多人同時搶紅包,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙...

    littleschemer13532021-05-16
主站蜘蛛池模板: 日本三级欧美三级人妇英文 | 肉大捧一进一出视频免费播放 | 久久精品动漫网一区二区 | 国产无限免费观看黄网站 | 韩国三级2020 | 欧美涩区 | 艾秋果冻麻豆老狼 | 免费看片黄| 美妇在线 | 天堂久久久久va久久久久 | 网红刘婷hd国产高清 | 亚洲欧美综合人成野草 | 欧美日韩在线观看精品 | 欧美色综合高清免费 | 亚洲国产精品久久精品怡红院 | 亚洲大片免费观看 | 精品一区heyzo在线播放 | 白丝萝莉h | 恩不要好大好硬好爽3p | 欧美成人aa久久狼窝动画 | 青草香蕉精品视频在线观看 | 99久久精彩视频 | 天堂a视频 | 爽好舒服使劲添高h视频 | 99精品视频免费在线观看 | 男女视频在线观看网站 | gayrb免费漫画入口 | 天天做天天爽天天谢 | 亚洲va韩国va欧美va天堂 | 2019国内自拍| 北条麻妃一区 | 亚洲 欧美 中文 日韩 视频 | 雪恋电影完整版免费观看 | 美女被到爽流动漫 | 亚洲人尿尿 | 欧美成人禁片在线观看俄罗斯 | 国语精彩对白2021 | 草草视频免费在线观看 | 日本不卡1卡2卡三卡网站二百 | 单身男女韩剧在线看 | 四虎影视永久在线精品免费 |