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

java中StringBuffer的length()和capacity()方法對(duì)比

 更新時(shí)間:2021年07月06日 08:46:44   作者:石頭剪刀布_  
這篇文章主要介紹了java中StringBuffer的length()和capacity()方法對(duì)比,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

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è)參考,也希望大家多多支持腳本之家。

相關(guān)文章

最新評(píng)論