2016.7.14
String ? 字符串常量
String是一個(gè)對(duì)象不是基本類型
是不可變對(duì)象酸钦,一旦創(chuàng)建就不能修改它的值
對(duì)于已存在的String對(duì)象操作都是創(chuàng)建一個(gè)新的String,并賦值新的值
String咱枉、StringBuffer和StringBuilder都是final類卑硫,不能被繼承
而String的各種拼接操作都是通過StringBuffer來完成的
String s = "Hello";//s引用靜態(tài)區(qū)的字符串字面量
String s = new String("Hello");//s引用堆上的字符串對(duì)象
創(chuàng)建徒恋,拼接
(+),concat
索引
indexOf欢伏、lastIndexOf
以開頭/結(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ì)象
它只能通過構(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),例如我們說到字符“漢”主胧,它的代碼點(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編碼的字符,嘿嘿)厢破。說得再羅嗦一點(diǎn)荣瑟,一個(gè)字符,僅僅對(duì)應(yīng)一個(gè)代碼點(diǎn)摩泪,但卻可能有多個(gè)代碼單元(即可能被編碼為2個(gè)char)笆焰。
//上面這段是copy來的,還不是很理解
//追加
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è)可以用來替換字符串荞驴,其中replaceFirst(String,String)不皆、replaceAll(String,String)第一個(gè)參數(shù)的String并不是一般的字符串,它需要轉(zhuǎn)義來通過正則表達(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開頭時(shí)术吝,arr.length為2