Java字符串是最常用的引用數(shù)據(jù)類型之一,那么對(duì)于一些小的細(xì)節(jié)可能很多朋友不夠特別了解,這一期我們就聊聊字符串谋币。
final
介紹String這個(gè)類之前需要先說(shuō)一下final這個(gè)關(guān)鍵字艘虎,在Java中final這個(gè)關(guān)鍵字起到一個(gè)非常重要的作用。
final可以修飾的目標(biāo)
final可以修飾類
final可以修飾變量
final可以修飾方法
final類
final修飾的類是不存在子類的悠垛,所以final形容的類是實(shí)現(xiàn)最完善的類(如果不完善线定,那么就不會(huì)被使用,這個(gè)類也就沒(méi)有意義了)确买。
final變量
final修飾的變量一般用于常量的定義上斤讥,因?yàn)橐坏┒x就無(wú)法改變了(基礎(chǔ)數(shù)據(jù)類型的話,無(wú)法改變的是值湾趾;引用數(shù)據(jù)類型的話芭商,無(wú)法改變的是引用)派草。
PS:本質(zhì)上基礎(chǔ)數(shù)據(jù)類型跟引用數(shù)據(jù)類型在內(nèi)存中的都是值,只不過(guò)這個(gè)值對(duì)于用戶的含義不同铛楣,一個(gè)存儲(chǔ)的就是值本身近迁,一個(gè)存儲(chǔ)的值是引用地址。
上圖可以看出final是不可以被修改的簸州。
如果是引用數(shù)據(jù)類型會(huì)是什么樣的呢鉴竭?
上圖可以看出常量可以在靜態(tài)代碼塊中初始化,但是不允許修改引用岸浑,不過(guò)引用的對(duì)象中的屬性是可以隨意修改的搏存。
final方法
final修飾的方法是不可以被重寫(xiě)的,該類方法的優(yōu)勢(shì)在于編譯器在編譯期就靜態(tài)綁定助琐,那么在使用上會(huì)快于動(dòng)態(tài)方法祭埂。
String
簡(jiǎn)介
String是一個(gè)final的類,根據(jù)上面的final介紹可以知道String被final修飾后的特性了兵钮。
String的很多方法在使用的時(shí)候蛆橡,會(huì)忽略的一點(diǎn)即使我們通過(guò)字符串對(duì)象調(diào)用了修改字符串的方法,但是該字符串本身是不會(huì)改變的掘譬。那么為什么不會(huì)修改本身呢泰演?
上圖可知字符串是通過(guò)一個(gè)final修飾的char的數(shù)組,所以字符串對(duì)象本身是不會(huì)修改的葱轩。
輸出結(jié)果
所以只要是對(duì)字符串本身做處理睦焕,都需要將方法的返回值保存到臨時(shí)變量中使用。
常用的連接方法
加號(hào)(+)連接
反編譯執(zhí)行過(guò)程靴拱,如下圖
上圖可知垃喊,字符串連接過(guò)程已經(jīng)被優(yōu)化成了StringBuilder的追加方式了。
再看一個(gè)例子
如圖可知append時(shí)間上的花費(fèi)是最少的袜炕。為什么呢本谜?
如圖可知,append方法是最快的偎窘,concat次之乌助,最差的就是+的方式,為什么呢陌知?仔細(xì)觀察不難看出他托,+的連接方式會(huì)在每次循環(huán)中創(chuàng)建一個(gè)StringBuilder對(duì)象,這樣會(huì)消耗非常多的資源仆葡。所以建議直接使用StringBuilder來(lái)構(gòu)建會(huì)變化的String(StringBuffer這個(gè)類基本上已經(jīng)被淘汰了赏参,因?yàn)樽址芳踊旧鲜遣恍枰€程同步的,所以一般不會(huì)使用這個(gè)類來(lái)拼接字符串)。
intern方法
intern方法調(diào)用會(huì)先去字符串常量池中查找相應(yīng)的字符串登刺,如果字符串不存在籽腕,就會(huì)在字符串常量池中創(chuàng)建該字符串然后再返回
基于JDK1.6
基于JDK1.8
可以看出其中的差別,涉及到了JVM相關(guān)的知識(shí)(處理字符串常量池不存在的字符串是怎樣的過(guò)程)
JDK1.6——intern方法會(huì)把首次出現(xiàn)的字符串復(fù)制到常量池中纸俭,并返回常量池中的引用皇耗。
JDK1.8——intern方法會(huì)把首次出現(xiàn)的字符串引用地址復(fù)制到常量池中,并返回該引用揍很。
總結(jié)
final的關(guān)鍵字在不長(zhǎng)改動(dòng)的代碼中嘗試使用以達(dá)到優(yōu)化系統(tǒng)性能的作用
字符串的拼接使用StringBuilder來(lái)完成
使用字符串修改的方法郎楼,一定要保存返回值
如果對(duì)字符串進(jìn)行判斷是否是同一個(gè)引用的時(shí)候,尤其是使用intern這種native方法的時(shí)候窒悔,一定要考慮JDK版本的差別呜袁。
面試題
final的作用
intern方法實(shí)現(xiàn)了什么樣的功能
IT技能學(xué)習(xí)請(qǐng)關(guān)注http://www.zparkedu.com/