Java-0006-String、StringBuffer、StringBuilder

2016.7.14

String ? 字符串常量

String是一個(gè)對(duì)象不是基本類型

是不可變對(duì)象,一旦創(chuàng)建就不能修改它的值

對(duì)于已存在的String對(duì)象操作都是創(chuàng)建一個(gè)新的String,并賦值新的值

String、StringBuffer和StringBuilder都是final類,不能被繼承

而String的各種拼接操作都是通過(guò)StringBuffer來(lái)完成的

String s = "Hello";//s引用靜態(tài)區(qū)的字符串字面量

String s = new String("Hello");//s引用堆上的字符串對(duì)象

創(chuàng)建,拼接

(+),concat

索引

indexOf、lastIndexOf

以開(kāi)頭/結(jié)尾

startsWith、endWith

獲取指定位置的字符

charAt()

獲取子字符串

substring(int,int)

比較

equals(String)和compareTo(String)

匹配

indexOf(String)和lastIndexOf(String)

修減兩邊空白

trim()

替換

replace(String,String)和replaceAll(String,String)

拆分

split(String)

StringBuffer和StringBuilder字符串變量

//更快,比String快幾百至幾千倍

StringBuffer//適用于多個(gè)線程操作同一個(gè)字符串的場(chǎng)景

StringBuilder//適用于單線程環(huán)境

//StringBuilder更快

StringBuffer?

//線程安全,需同步,可能會(huì)需要等待

是一個(gè)可變對(duì)象,對(duì)它修改是不會(huì)創(chuàng)建新的對(duì)象

它只能通過(guò)構(gòu)造函數(shù)創(chuàng)建,不能賦值

創(chuàng)建后內(nèi)存會(huì)分配給它內(nèi)存空間,并初始保存一個(gè)null

想要賦值是可以用它的append()方法

內(nèi)存空間--字符串緩沖區(qū),若溢出Java將自動(dòng)擴(kuò)充

StringBuffer sb = new StringBuffer();

sb.append("hello");

也可以構(gòu)造時(shí)傳入初始值

StringBuffer sb = new StringBuffer("hello");

StringBuffer比String高效的原因,

String str = new String("hello");

str+="hi";

的操作步驟實(shí)際上是創(chuàng)建一個(gè)StringBuffer,然后調(diào)用append方法,再調(diào)用toString方法賦值給str

String比StringBuffer多了很多附加步驟,所以很慢

StringBuilder

//線程不安全,不需同步,不需要等待,會(huì)比StringBuffer更快

StringBuilder與StringBuffer相似

該類被設(shè)計(jì)用作 StringBuffer 的一個(gè)簡(jiǎn)易替換,用在字符串緩沖區(qū)被單個(gè)線程使用的時(shí)候(這種情況很普遍)。


//在指定位置插入字符串

insert(int ,String)

//刪除指定位置字符串

delete(int ,int)

//倒轉(zhuǎn)

reverse()

一個(gè)完整的Unicode字符叫代碼點(diǎn)CodePoint,而一個(gè)Java char叫代碼單元code unit。如果String 對(duì)象以UTF-16保存 Unicode 字符,需要用2個(gè)字符表示一個(gè)超大字符集的漢字,這這種表示方式稱之為 Surrogate,第一個(gè)字符叫Surrogate High,第二個(gè)就是Surrogate Low。

代碼點(diǎn)(Code Point)就是指Unicode中為字符分配的編號(hào),一個(gè)字符只占一個(gè)代碼點(diǎn),例如我們說(shuō)到字符“漢”,它的代碼點(diǎn)是U+6C49.代碼單元(Code Unit)則是針對(duì)編碼方法而言,它指的是編碼方法中對(duì)一個(gè)字符編碼以后所占的最小存儲(chǔ)單元。 例如UTF-8中,代碼單元是一個(gè)字節(jié),因?yàn)橐粋€(gè)字符可以被編碼為1個(gè),2個(gè)或者3個(gè)4個(gè)字節(jié);在UTF-16中,代碼單元變成了兩個(gè)字節(jié)(就是一個(gè) char),因?yàn)橐粋€(gè)字符可以被編碼為1個(gè)或2個(gè)char(你找不到比一個(gè)char還小的UTF-16編碼的字符,嘿嘿)。說(shuō)得再羅嗦一點(diǎn),一個(gè)字符,僅僅對(duì)應(yīng)一個(gè)代碼點(diǎn),但卻可能有多個(gè)代碼單元(即可能被編碼為2個(gè)char)。

//上面這段是copy來(lái)的,還不是很理解

//追加

append(String)


System.currentTimeMilis//當(dāng)前時(shí)間


字符串操作注意

toCharArray()

可以將一個(gè)字符串返回成一個(gè)字符數(shù)組,配合for循環(huán)可以很好的操作字符

replace(String,String)、replaceFirst(String,String)、replaceAll(String,String)

則3個(gè)可以用來(lái)替換字符串,其中replaceFirst(String,String)、replaceAll(String,String)第一個(gè)參數(shù)的String并不是一般的字符串,它需要轉(zhuǎn)義來(lái)通過(guò)正則表達(dá)式

例如你想匹配一個(gè)"+",你就需要輸入"+"的轉(zhuǎn)義字符"\+",但"\"也是需要轉(zhuǎn)義的,就變成了"\\+"

split(String)

拆分函數(shù)的參數(shù)也需要轉(zhuǎn)義

另外拆分完的數(shù)組也很有趣,例如String[ ] arr = str.split(word);

當(dāng)str和word字符串內(nèi)容相同時(shí),arr.length為0

當(dāng)str比word長(zhǎng),并且str以word結(jié)尾時(shí),arr.length為1

但當(dāng)str比word長(zhǎng),并且str以word開(kāi)頭時(shí),arr.length為2


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容