String不可變StringBuffer可變

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ì)象,垃圾回收影響性能

不可變好處:

  1. 只有當(dāng)字符串是不可變的,字符串池才有可能實(shí)現(xiàn)。字符串池的實(shí)現(xiàn)可以在運(yùn)行時(shí)節(jié)約很多heap空間,因?yàn)椴煌淖址兞慷贾赶虺刂械耐粋€(gè)字符串。但如果字符串是可變的,那么String interning將不能實(shí)現(xiàn)

  2. 數(shù)據(jù)庫(kù)的用戶名、密碼都是以字符串的形式傳入來(lái)獲得數(shù)據(jù)庫(kù)的連接,或者在socket編程中,主機(jī)名和端口都是以字符串的形式傳入。因?yàn)樽址遣豢勺兊?,所以它的值是不可改變的,否則黑客們可以鉆到空子,改變字符串指向的對(duì)象的值,造成安全漏洞。

  3. 因?yàn)樽址遣豢勺兊模允嵌嗑€程共享安全的,同一個(gè)字符串實(shí)例可以被多個(gè)線程共享。

  4. 因?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域的值可以被保存在寄存器中,而不用從主存中頻繁重新讀取。

最后編輯于
?著作權(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)容

  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語(yǔ)法,類相關(guān)的語(yǔ)法,內(nèi)部類的語(yǔ)法,繼承相關(guān)的語(yǔ)法,異常的語(yǔ)法,線程的語(yǔ)...
    子非魚(yú)_t_閱讀 34,652評(píng)論 18 399
  • Tip:筆者馬上畢業(yè)了,準(zhǔn)備開(kāi)始 Java 的進(jìn)階學(xué)習(xí)計(jì)劃。于是打算先從 String 類的源碼分析入手,作為后面...
    石先閱讀 12,107評(píng)論 16 58
  • final關(guān)鍵字(最終) final修飾的類無(wú)法被繼承. final修飾的方法無(wú)法被覆蓋. final修飾的局部變...
    yangliangliang閱讀 728評(píng)論 0 0
  • 、6一、基本知識(shí) 1.JDK和JRE的區(qū)別 答:JDK是java語(yǔ)言開(kāi)發(fā)工具包,包含JRE和開(kāi)發(fā)工具(javac....
    夢(mèng)游的沙師弟閱讀 1,371評(píng)論 0 4
  • 不知不覺(jué),這一個(gè)月終于過(guò)完了,不敢想象我自己有這么大的本事,一個(gè)人帶著2個(gè)小孩,大的5歲,小的剛出生,為了轉(zhuǎn)移我的...
    女王雪兒閱讀 262評(píng)論 0 0

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