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