后面大家會接觸StringBuffer 和StringBuiler 這兩個前者是線程安全的,后面是線程不安全,后面我們會詳細(xì)討論,說道這兩個類都是繼承于AbstractStringBuiler,現(xiàn)在我們來詳細(xì)討論一下。
1.
兩個屬性咸产,說明內(nèi)部是以字符數(shù)組實現(xiàn)的,count是已經(jīng)使用的數(shù)組長度仲闽。
2.
兩個構(gòu)造函數(shù)脑溢,前一個無參不多說,后者構(gòu)造函數(shù)是帶容量的赖欣,值得注意的是這個是容量屑彻,和實際使用大小count做區(qū)分。
3.
前者是獲取當(dāng)前長度也就是之前提到的實際使用大小社牲,后者指的是初始化時的容量
3.
這個方法歸根結(jié)度就是做了一個擴(kuò)容操作,而且擴(kuò)容的套路是 2倍+2悴了, 默認(rèn)是16的容量搏恤,下一次擴(kuò)容就是34违寿,這邊擴(kuò)容比較jdk1.7多封裝了一層ensureCapacityInternal方法,進(jìn)入ensureCapacityInternal熟空,可以看到底層是復(fù)制了一個array藤巢,調(diào)用newCapacity 方法,在進(jìn)到neCapacity中息罗,可以看到這里就行了擴(kuò)容還是采取<<1 位移的方式擴(kuò)容掂咒,再往下看,底層還做了一層校驗迈喉,調(diào)用了hugeCapacity 方法俏扩,實際上是做了一層校驗,看看他有沒有溢出弊添,溢出的臨界長度是Integer的最大長度,我估計這輩子都不會遇到一次
4.
這是一個優(yōu)化方法捌木,優(yōu)化存儲空間油坝,如果長度小于容量,則縮減到剛剛好的位置刨裆。
5.
博主找了很多帖子澈圈,沒有發(fā)現(xiàn)講清楚的,博主自己理解下來帆啃,是在給他設(shè)置長度瞬女,超過部分設(shè)置成“\0”
6.
返回字符串指定位置的字符。
7.
這邊幾個方法都是涉及到代碼點的方法努潘,博主一直沒有理解代碼點诽偷,歡迎看到的人給博主評論。以下是博主搜到的對于代碼點的解釋:
碼點疯坤,我譯為“碼位值”报慕。每個碼位值實際上代表一個真正unicode字符。即unicode字符集上的碼位值压怠。
為什么要這些碼位相關(guān)的方法?源自1個java的char字符并不完全等于一個unicode的字符眠冈。
char采用UCS-2編碼是一種淘汰的UTF-16編碼,最多65536種形態(tài)菌瘫,也遠(yuǎn)少于當(dāng)今unicode擁有11萬字符的需求蜗顽。java只好對后來新增的unicode字符用2個char拼出1個unicode字符。導(dǎo)致String中char的數(shù)量不等于unicode字符的數(shù)量雨让。
8.
底層是數(shù)組的復(fù)制雇盖,value是源數(shù)組,srcBegin是起始位置栖忠,dst是目標(biāo)數(shù)組刊懈,dstBegin是目標(biāo)數(shù)組起始位置这弧,這里有一個深拷貝和淺拷貝的概念,對于一維數(shù)組來說虚汛,這種復(fù)制屬性值傳遞匾浪,修改副本不會影響原來的值。對于二維或者一維數(shù)組中存放的是對象時卷哩,復(fù)制結(jié)果是一維的引用變量傳遞給副本的一維數(shù)組蛋辈,修改副本時,會影響原來的數(shù)組将谊。
9.
是替換原來位置的字符冷溶。
10.
顯示判斷了一下是不是空,如果是空則調(diào)用appendNull()方法尊浓,放一個“null” 進(jìn)去 注意是帶上雙引號的逞频,如果不是,則調(diào)用一下ensureCapacityInternal 確認(rèn)一下容量夠不夠栋齿,不夠就增加容量苗胀,然后采用上一個我們提到的getChars的方法將value中的值復(fù)制進(jìn)str
11.
這三個和上面的都是一個套路,這里就不在贅述了瓦堵。
12.
先判斷是不是越界了基协,然后擴(kuò)容一個套路,然后從start位置開始到end菇用,一個一個charAt 丟到value 里面澜驮。
13.
套路一樣,底層走arraycopy? 注意淺拷貝和深拷貝
14.
塞入 “true”“false” 注意兩個雙引號惋鸥。
15.
后面都很好理解杂穷,但是前面的if 判斷樓主看了一頭霧水,為什么要加怎么一次校驗卦绣,樓主查了一次亭畜,大概是怎么一個意思。計算機(jī)內(nèi)部負(fù)數(shù)做比較的時候迎卤,才用取反再加一的形式拴鸵。所以會有相等的局面出現(xiàn),這個判斷就是為了解決這個問題蜗搔。
16.
調(diào)用了FloatingDecimal的appendTo 方法劲藐,不在贅述。
17.
刪除樟凄,底層把要的那部分復(fù)制到新的array中即可
18.
附加碼位值聘芜,上面有提到碼位值的概念,不在贅述缝龄,代碼總體思路還是一致的汰现,先擴(kuò)容在加挂谍。
19.
不贅述
20.
替換從start開始end 結(jié)束 ,實際上從end開始(也就是移除后的位置)瞎饲,賦給start+len(留足str的空間)口叙,長度是剩下的長度
21.
從起始位置開始到結(jié)束位置全部截掉。
22.
在index位置處嗅战,插入str offset開始妄田,len長度的串,底層arraycopy
23.
主要走的第二個方法驮捍,底層還是arrayCopy方法疟呐。
24.
換湯不換藥,其他類想valueOf轉(zhuǎn)成String 就一樣了
25.
從fromIndex 開始查找str 返回第一個的下標(biāo)东且,沒有就返回-1
26.
一樣的配方启具,翻過來,
27.
看一下是否有寬字符珊泳,如果有就轉(zhuǎn)換過去鲁冯。
28.
調(diào)的基類object中的toString
29.
返回value值
PS:哪里不對可以在評論中指出,我都會一個個看的旨椒,覺得少東西也可以評論中提出來,我會做補(bǔ)充堵漱。