java判斷stringbuilder不為空 string、stringbuffer和stringbuilder有什么區(qū)別?
string、stringbuffer和stringbuilder有什么區(qū)別?java中有三個(gè)類(lèi)負(fù)責(zé)字符的操作。是一個(gè)單字符操作,對(duì)字符串進(jìn)行操作。不可變類(lèi)。它也對(duì)字符串進(jìn)行操作,但它是可變的。Str
string、stringbuffer和stringbuilder有什么區(qū)別?
java中有三個(gè)類(lèi)負(fù)責(zé)字符的操作。
是一個(gè)單字符操作,
對(duì)字符串進(jìn)行操作。不可變類(lèi)。
它也對(duì)字符串進(jìn)行操作,但它是可變的。
String:
該對(duì)象不是原始類(lèi)型。
作為不可變對(duì)象,一旦創(chuàng)建,其值就不能修改。
對(duì)現(xiàn)有字符串對(duì)象的任何修改都是創(chuàng)建一個(gè)新對(duì)象,然后保存新值。
String是最終類(lèi),也就是說(shuō),它不能被繼承。
StringBuff:
是一個(gè)可變對(duì)象,當(dāng)它被修改時(shí),不會(huì)像String一樣重新建立。
它只能由構(gòu)造函數(shù)建立,
StringBuff:罐頭公司。;不要通過(guò)支付價(jià)值符號(hào)來(lái)向他支付價(jià)值。
sb歡迎來(lái)到這里!//錯(cuò)誤
對(duì)象建立后,會(huì)在內(nèi)存中分配內(nèi)存空間,最初會(huì)保存一個(gè)null。到StringBuff:
是一個(gè)變量對(duì)象,與StringBuff:。
字符串字符串新字符串(歡迎使用)
str在這里
其實(shí)的處理步驟就是建立一個(gè)StringBuffer,讓侯調(diào)用append(),最后,
然后StringBuffer toSting()
這種情況下,String的連接操作會(huì)比StringBuffer多一些額外的操作,當(dāng)然效率會(huì)打折扣。
而且因?yàn)镾tring對(duì)象是不可變的,每次操作Sting都會(huì)重新建立一個(gè)新的對(duì)象來(lái)保存新的值。
這樣原來(lái)的對(duì)象就沒(méi)用了,會(huì)被垃圾回收,也會(huì)影響性能。
請(qǐng)看下面的代碼:
26個(gè)英文字母被添加了5000次,
字符串tempstr abcdefghijklmnopqrstuvwxyz
int乘以5000
long lstart1()
字符串str
for (int i 0 i lt times i ) {
str tempstr
}
長(zhǎng)lend1()
長(zhǎng)時(shí)間(lend1 - lstart1)
(時(shí)間)
可惜我的電腦不是超級(jí)計(jì)算機(jī),每次結(jié)果也不一定一樣,一般是46687左右。
那是46秒。
讓 讓我們?cè)倏匆幌孪旅娴拇a。
字符串tempstr abcdefghijklmnopqrstuvwxyz
int乘以5000
long lstart2()
StringBuffer sb new StringBuffer()
for (int i 0 i lt times i ) {
(臨時(shí))
}
長(zhǎng)lend2()
長(zhǎng)時(shí)間2 (lend2 - lstart2)
(時(shí)間2)
結(jié)果是16,有時(shí)是0。
所以結(jié)論很明顯,StringBuffer的速度幾乎是String的一萬(wàn)倍。當(dāng)然這個(gè)數(shù)據(jù)不是很準(zhǔn)確。因?yàn)檠h(huán)次數(shù)是10萬(wàn),所以差別更大。如果你不喜歡,試試看。;不要相信我。
根據(jù)以上所述:
str在這里
其實(shí)的處理步驟就是建立一個(gè)StringBuffer,讓侯調(diào)用append(),最后,
然后StringBuffer toSting()
所以這里的str可以等同于
新的字符串緩沖區(qū)
(此處)
str()
所以上面直接用來(lái)連接String的代碼基本可以等價(jià)于下面的代碼。
字符串tempstr abcd:需要在程序中頻繁修改和連接字符串,使用StringBuff
string類(lèi)和stringbuild類(lèi)的區(qū)別為什么一定要有這兩個(gè)類(lèi)?
兩個(gè)類(lèi)的工作原理不同。:String類(lèi)是傳統(tǒng)的修改。改變字符串的,它確實(shí)可以完成將一個(gè)字符串添加到另一個(gè)字符串的工作,但是在。NET框架,這個(gè)操作真的不劃算。因?yàn)橄到y(tǒng)先將兩個(gè)字符串寫(xiě)入內(nèi)存,然后刪除原來(lái)的string對(duì)象,再創(chuàng)建一個(gè)String對(duì)象,讀取內(nèi)存中的數(shù)據(jù)并賦給它。來(lái)來(lái)去去花了很多時(shí)間。
在系統(tǒng)下使用StringBuilder類(lèi)時(shí),情況并非如此。文本名稱(chēng)空間。它提供的Append方法可以在已有對(duì)象的原位置修改字符串,簡(jiǎn)單直接。
如果要給一個(gè)字符串增加很多操作,StringBuilder類(lèi)花費(fèi)的時(shí)間和String類(lèi)根本不是一個(gè)數(shù)量級(jí)。