Java基礎(chǔ)——String

Java基礎(chǔ)之字符串

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修飾的方法是不可以被重寫的,該類方法的優(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的作用

字符串+與append的區(qū)別

intern方法實(shí)現(xiàn)了什么樣的功能

IT技能學(xué)習(xí)請(qǐng)關(guān)注http://www.zparkedu.com/

?著作權(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)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

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