java中StringBuffer的length()和capacity()方法對(duì)比
StringBuffer的length()和capacity()
StringBuffer類和String類差不多,都是字符串類,只是StringBuffer在對(duì)字符串進(jìn)行修改時(shí)不會(huì)生成新的對(duì)象,所以效率相對(duì)較高,占用空間也小。
length()方法和capacity()方法都是獲取StringBuffer的長度。
length()返回字符串的實(shí)際長度;
capacity()返回字符串所占容器的總大小。
舉例:

可以看到:
1.StringBuffer的的初始大小為(16+初始字符串長度)即capacity=16+初始字符串長度;
2.一旦length大于capacity時(shí),capacity便在前一次的基礎(chǔ)上加1后倍增;
例如:
length=1;capacity=17;//初始長度 length=5;capacity=17;// length=17;capacity=17;// length=18;capacity=(capacity+1)*2=36;//第一次倍增 ............ length=37;capacity=(capacity+1)*2=74;//第二次倍增 ............
但有如下特殊情況:
StringBuffer sb3=new StringBuffer("a");
System.out.println("length="+sb3.length());//length=1
System.out.println("capacity="+sb3.capacity());//capacity=17;
System.out.println("--------------------");
sb3.append("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa");
System.out.println("length="+sb3.length());//length=20;
System.out.println("capacity="+sb3.capacity());//capacity=40;
當(dāng)length>capacity時(shí),capacity倍增仍達(dá)不到length的長度,這種現(xiàn)象稱為跨階,此時(shí),capacity將根據(jù)length的實(shí)際大小設(shè)置長度,此后將按照直接倍增的方式增長(不將length+1)
StringBuffer類初始容量及擴(kuò)容
StringBuffer類可以創(chuàng)建可修改的字符串序列
該類有StringBuffer(),StringBuffer(int size),StringBuffer(String s)三個(gè)改造方法。
1.StringBuffer()的初始容量可以容納16個(gè)字符,當(dāng)該對(duì)象的實(shí)體存放的字符的長度大于16時(shí),實(shí)體容量就自動(dòng)增加。StringBuffer對(duì)象可以通過length()方法獲取實(shí)體中存放的字符序列長度,通過capacity()方法來獲取當(dāng)前實(shí)體的實(shí)際容量。
2.StringBuffer(int size)可以指定分配給該對(duì)象的實(shí)體的初始容量參數(shù)為參數(shù)size指定的字符個(gè)數(shù)。當(dāng)該對(duì)象的實(shí)體存放的字符序列的長度大于size個(gè)字符時(shí),實(shí)體的容量就自動(dòng)的增加。以便存放所增加的字符。
3.StringBuffer(String s)可以指定給對(duì)象的實(shí)體的初始容量為參數(shù)字符串s的長度額外再加16個(gè)字符。當(dāng)該對(duì)象的實(shí)體存放的字符序列長度大于size個(gè)字符時(shí),實(shí)體的容量自動(dòng)的增加,以便存放所增加的字符。
接下來介紹StringBuffer()怎樣擴(kuò)容:
首先我們需要知道StringBuffer和StringBuilder類都繼承了抽象類AbstractStringBuilder類;
源碼都調(diào)用父類來進(jìn)行初始化:

StringBuffer(String s)的初始化:

擴(kuò)容算法:
使用append()方法在字符串后面追加?xùn)|西的時(shí)候,如果長度超過了該字符串存儲(chǔ)空間大小了就需要進(jìn)行擴(kuò)容:構(gòu)建新的存儲(chǔ)空間更大的字符串,將久的復(fù)制過去;
再進(jìn)行字符串a(chǎn)ppend添加的時(shí)候,會(huì)先計(jì)算添加后字符串大小,傳入一個(gè)方法:ensureCapacityInternal 這個(gè)方法進(jìn)行是否擴(kuò)容的判斷,需要擴(kuò)容就調(diào)用expandCapacity方法進(jìn)行擴(kuò)容:

嘗試將新容量擴(kuò)為大小變成2倍+2 if 判斷一下 容量如果不夠,直接擴(kuò)充到需要的容量大小。
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
- java中String StringBuffer和StringBuilder的區(qū)別詳解
- java中String、StringBuffer與StringBuilder的區(qū)別
- JAVA基礎(chǔ)類庫之String類,StringBuffer類和StringBuilder類
- Java基礎(chǔ)之StringBuffer詳解
- Java利用StringBuffer替換特殊字符的方法實(shí)現(xiàn)
- java中stringbuffer線程安全分析實(shí)例詳解
- Java常用類庫StringBuffer,Runtime,日期操作類等類庫總結(jié)
- java String、StringBuilder和StringBuffer的區(qū)別詳解
- Java 基礎(chǔ)全面講解StringBuffer類的使用
相關(guān)文章
第三方網(wǎng)站微信登錄java代碼實(shí)現(xiàn)
這篇文章主要為大家詳細(xì)介紹了第三方網(wǎng)站微信登錄的java代碼實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-04-04
java調(diào)用webservice接口,并解析返回參數(shù)問題
這篇文章主要介紹了java調(diào)用webservice接口,并解析返回參數(shù)問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-07-07
利用Kotlin + Spring Boot實(shí)現(xiàn)后端開發(fā)
這篇文章主要給大家介紹了關(guān)于利用Kotlin + Spring Boot實(shí)現(xiàn)后端開發(fā)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2018-11-11
Java獲取HttpServletRequest的三種方法詳解
這篇文章主要介紹了Java獲取HttpServletRequest的三種方法詳解,是一個(gè)接口,全限定名稱為Jakarta.Serclet.http.HttpServletRequest2023-11-11
HttpServletRequest接口是Servlet規(guī)范的一員,需要的朋友可以參考下
解決在啟動(dòng)eclipse的tomcat進(jìn)行訪問時(shí)出現(xiàn)404問題的方法
這篇文章主要介紹了解決在啟動(dòng)eclipse的tomcat進(jìn)行訪問時(shí)出現(xiàn)404問題的方法,感興趣的小伙伴們可以參考一下2016-04-04
IDEA新建springboot項(xiàng)目時(shí)未生成pom.xml文件的解決操作
這篇文章主要給大家介紹了關(guān)于IDEA新建springboot項(xiàng)目時(shí)未生成pom.xml文件的解決操作方法,文中通過實(shí)例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2023-02-02

