String是一個(gè)類,也可以表示字符串?dāng)?shù)據(jù)類型
String:是對(duì)象不是原始類型.為不可變對(duì)象,一旦被創(chuàng)建,就不能修改它的值.對(duì)于已經(jīng)存在的String對(duì)象的修改都是重新創(chuàng)建一個(gè)新的對(duì)象,然后把新的值保存進(jìn)去.
String 是final類,即不能被繼承.作為參數(shù)傳遞時(shí),只是復(fù)制了一份引用
string s = "a";
s = "b";
那意思是這里是兩個(gè)對(duì)象,string s = "a";是一個(gè)對(duì)象,s = "b"; 又是1個(gè)對(duì)象,第一個(gè)對(duì)象會(huì)被垃圾回收
StringBuffer:
是一個(gè)可變對(duì)象,當(dāng)對(duì)他進(jìn)行修改的時(shí)候不會(huì)像String那樣重新建立對(duì)象
它只能通過(guò)構(gòu)造函數(shù)來(lái)建立,
StringBuffer sb = new StringBuffer();
對(duì)象被建立以后,在內(nèi)存中就會(huì)分配內(nèi)存空間,并初始保存一個(gè)null.向StringBuffer中賦值的時(shí)候可以通過(guò)它的append方法.
sb.append("hello");
StringBuffer的處理步驟實(shí)際上是通過(guò)建立一個(gè)StringBuffer,然后調(diào)用append(),最后再將StringBuffer toSting(); insert方法
比較
字符串連接操作中StringBuffer的效率要比String高
String 新建對(duì)象,垃圾回收影響性能
不可變好處:
只有當(dāng)字符串是不可變的,字符串池才有可能實(shí)現(xiàn)。字符串池的實(shí)現(xiàn)可以在運(yùn)行時(shí)節(jié)約很多heap空間,因?yàn)椴煌淖址兞慷贾赶虺刂械耐粋€(gè)字符串。但如果字符串是可變的,那么String interning將不能實(shí)現(xiàn)
數(shù)據(jù)庫(kù)的用戶名、密碼都是以字符串的形式傳入來(lái)獲得數(shù)據(jù)庫(kù)的連接,或者在socket編程中,主機(jī)名和端口都是以字符串的形式傳入。因?yàn)樽址遣豢勺兊?,所以它的值是不可改變的,否則黑客們可以鉆到空子,改變字符串指向的對(duì)象的值,造成安全漏洞。
因?yàn)樽址遣豢勺兊模允嵌嗑€程共享安全的,同一個(gè)字符串實(shí)例可以被多個(gè)線程共享。
因?yàn)樽址遣豢勺兊?,所以在它?chuàng)建的時(shí)候hashcode就被緩存了,不需要重新計(jì)算。這就使得字符串很適合作為Map中的鍵,字符串的處理速度要快過(guò)其它的鍵對(duì)象。這就是HashMap中的鍵往往都使用字符串
5.類加載器要用到字符串,不可變性提供了安全性,以便正確的類被加載。譬如你想加載java.sql.Connection類,而這個(gè)值被改成了myhacked.Connection,那么會(huì)對(duì)你的數(shù)據(jù)庫(kù)造成不可知的破壞。
壞處:影響效率,對(duì)系統(tǒng)性能產(chǎn)生影響。 特別當(dāng)內(nèi)存中無(wú)引用對(duì)象多了以后, JVM 的 GC 就會(huì)開(kāi)始工作,那速度是一定會(huì)相當(dāng)慢的
StringBuffer 和StringBuilder可變
區(qū)別
改變 StringBuffer 每次結(jié)果都會(huì)對(duì) StringBuffer 對(duì)象本身進(jìn)行操作,而不是生成新的對(duì)象,再改變對(duì)象引用。
StringBuilder類被設(shè)計(jì)用作 StringBuffer 的一個(gè)簡(jiǎn)易替換,用在字符串緩沖區(qū)被單個(gè)線程使用的時(shí)候(這種情況很普遍)。但不保證同步。如果可能,建議優(yōu)先采用該類,因?yàn)樵诖蠖鄶?shù)實(shí)現(xiàn)中,它比 StringBuffer 要快。兩者的方法基本相同。
Final關(guān)鍵字
final關(guān)鍵詞生命的域的值只能被 初始化一次,一般在構(gòu)造方法中初始化,在多線程開(kāi)發(fā)中,final域通常用來(lái)實(shí)現(xiàn)不可變對(duì)象,當(dāng)對(duì)象中干的共享變量的值不可能發(fā)生變化時(shí),在多線程中也就不需要同步來(lái)進(jìn)行處理,故在多線程開(kāi)發(fā)中應(yīng)該盡可能使用不可變對(duì)象。另外,在代碼執(zhí)行時(shí),final域的值可以被保存在寄存器中,而不用從主存中頻繁重新讀取。