久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

Java Java 7 源碼學(xué)習(xí)系列(一)——String

 愛可樂的小咖 2016-08-30

String表示字符串,,Java中所有字符串的字面值都是String類的實(shí)例,例如“ABC”,。字符串是常量,,在定義之后不能被改變,字符串緩沖區(qū)支持可變的字符串,。因?yàn)?String 對(duì)象是不可變的,,所以可以共享它們。例如:

Java Java 7 源碼學(xué)習(xí)系列(一)——String

相當(dāng)于

Java Java 7 源碼學(xué)習(xí)系列(一)——String

這里還有一些其他使用字符串的例子:

Java Java 7 源碼學(xué)習(xí)系列(一)——String

String類提供了檢查字符序列中單個(gè)字符的方法,,比如有比較字符串,,搜索字符串,,提取子字符串,創(chuàng)建一個(gè)字符串的副本,、字符串的大小寫轉(zhuǎn)換等,。實(shí)例映射是基于Character類中指定的Unicode標(biāo)準(zhǔn)的。 Java語言提供了對(duì)字符串連接運(yùn)算符的特別支持(+),,該符號(hào)也可用于將其他類型轉(zhuǎn)換成字符串,。字符串的連接實(shí)際上是通過StringBuffer或者StringBuilderappend()方法來實(shí)現(xiàn)的,字符串的轉(zhuǎn)換通過toString方法實(shí)現(xiàn),,該方法由 Object 類定義,,并可被 Java 中的所有類繼承。 除非另有說明,,傳遞一個(gè)空參數(shù)在這類構(gòu)造函數(shù)或方法會(huì)導(dǎo)致NullPointerException異常被拋出,。String表示一個(gè)字符串通過UTF-16(unicode)格式,補(bǔ)充字符通過代理對(duì)(參見Character類的 Unicode Character Representations 獲取更多的信息)表示,。索引值參考字符編碼單元,,所以補(bǔ)充字符在String中占兩個(gè)位置。

定義 屬性 構(gòu)造方法

使用字符數(shù)組,、字符串構(gòu)造一個(gè)String

使用字節(jié)數(shù)組構(gòu)造一個(gè)String

使用StringBuffer和StringBuider構(gòu)造一個(gè)String

一個(gè)特殊的保護(hù)類型的構(gòu)造方法

其他方法

getBytes

比較方法

hashCode

substring

replaceFirst,、replaceAll、replace區(qū)別

copyValueOf 和 valueOf

intern

String對(duì)“+”的重載

String.valueOf和Integer.toString的區(qū)別

參考資料

一,、定義

Java Java 7 源碼學(xué)習(xí)系列(一)——String

從該類的聲明中我們可以看出String是final類型的,,表示該類不能被繼承,同時(shí)該類實(shí)現(xiàn)了三個(gè)接口:java.io.Serializable,、 Comparable,、 CharSequence

二、屬性

Java Java 7 源碼學(xué)習(xí)系列(一)——String

這是一個(gè)字符數(shù)組,,并且是final類型,他用于存儲(chǔ)字符串內(nèi)容,,從fianl這個(gè)關(guān)鍵字中我們可以看出,,String的內(nèi)容一旦被初始化了是不能被更改的。 雖然有這樣的例子: String s = “a”; s = “b” 但是,,這并不是對(duì)s的修改,,而是重新指向了新的字符串, 從這里我們也能知道,,String其實(shí)就是用char[]實(shí)現(xiàn)的,。

Java Java 7 源碼學(xué)習(xí)系列(一)——String

緩存字符串的hash Code,默認(rèn)值為 0

Java Java 7 源碼學(xué)習(xí)系列(一)——String

因?yàn)?code>String實(shí)現(xiàn)了Serializable接口,,所以支持序列化和反序列化支持,。Java的序列化機(jī)制是通過在運(yùn)行時(shí)判斷類的serialVersionUID來驗(yàn)證版本一致性的,。在進(jìn)行反序列化時(shí),JVM會(huì)把傳來的字節(jié)流中的serialVersionUID與本地相應(yīng)實(shí)體(類)的serialVersionUID進(jìn)行比較,,如果相同就認(rèn)為是一致的,,可以進(jìn)行反序列化,否則就會(huì)出現(xiàn)序列化版本不一致的異常(InvalidCastException),。

三,、構(gòu)造方法

String類作為一個(gè)java.lang包中比較常用的類,自然有很多重載的構(gòu)造方法.在這里介紹幾種典型的構(gòu)造方法:

1.使用字符數(shù)組、字符串構(gòu)造一個(gè)String

我們知道,,其實(shí)String就是使用字符數(shù)組(char[])實(shí)現(xiàn)的,。所以我們可以使用一個(gè)字符數(shù)組來創(chuàng)建一個(gè)String,那么這里值得注意的是,,當(dāng)我們使用字符數(shù)組創(chuàng)建String的時(shí)候,,會(huì)用到Arrays.copyOf方法和Arrays.copyOfRange方法。這兩個(gè)方法是將原有的字符數(shù)組中的內(nèi)容逐一的復(fù)制到String中的字符數(shù)組中,。同樣,,我們也可以用一個(gè)String類型的對(duì)象來初始化一個(gè)String。這里將直接將源String中的valuehash兩個(gè)屬性直接賦值給目標(biāo)String,。因?yàn)镾tring一旦定義之后是不可以改變的,,所以也就不用擔(dān)心改變源String的值會(huì)影響到目標(biāo)String的值。

當(dāng)然,,在使用字符數(shù)組來創(chuàng)建一個(gè)新的String對(duì)象的時(shí)候,,不僅可以使用整個(gè)字符數(shù)組,也可以使用字符數(shù)組的一部分,,只要多傳入兩個(gè)參數(shù)int offsetint count就可以了,。

2.使用字節(jié)數(shù)組構(gòu)造一個(gè)String

在Java中,String實(shí)例中保存有一個(gè)char[]字符數(shù)組,,char[]字符數(shù)組是以u(píng)nicode碼來存儲(chǔ)的,,String 和 char 為內(nèi)存形式,byte是網(wǎng)絡(luò)傳輸或存儲(chǔ)的序列化形式,。所以在很多傳輸和存儲(chǔ)的過程中需要將byte[]數(shù)組和String進(jìn)行相互轉(zhuǎn)化,。所以,String提供了一系列重載的構(gòu)造方法來將一個(gè)字符數(shù)組轉(zhuǎn)化成String,,提到byte[]和String之間的相互轉(zhuǎn)換就不得不關(guān)注編碼問題,。String(byte[] bytes, Charset charset)是指通過charset來解碼指定的byte數(shù)組,將其解碼成unicode的char[]數(shù)組,,夠造成新的String,。

這里的bytes字節(jié)流是使用charset進(jìn)行編碼的,想要將他轉(zhuǎn)換成unicode的char[]數(shù)組,,而又保證不出現(xiàn)亂碼,,那就要指定其解碼方式

同樣使用字節(jié)數(shù)組來構(gòu)造String也有很多種形式,,按照是否指定解碼方式分的話可以分為兩種:

String(byte bytes[]) String(byte bytes[], int offset, int length)

String(byte bytes[], Charset charset)

String(byte bytes[], String charsetName)

String(byte bytes[], int offset, int length, Charset charset)

String(byte bytes[], int offset, int length, String charsetName)

如果我們?cè)谑褂胋yte[]構(gòu)造String的時(shí)候,使用的是下面這四種構(gòu)造方法(帶有charsetName或者charset參數(shù))的一種的話,,那么就會(huì)使用StringCoding.decode方法進(jìn)行解碼,,使用的解碼的字符集就是我們指定的charsetName或者charset。 我們?cè)谑褂胋yte[]構(gòu)造String的時(shí)候,,如果沒有指明解碼使用的字符集的話,,那么StringCodingdecode方法首先調(diào)用系統(tǒng)的默認(rèn)編碼格式,如果沒有指定編碼格式則默認(rèn)使用ISO-8859-1編碼格式進(jìn)行編碼操作,。主要體現(xiàn)代碼如下:

Java Java 7 源碼學(xué)習(xí)系列(一)——String

3.使用StringBuffer和StringBuider構(gòu)造一個(gè)String

作為String的兩個(gè)“兄弟”,,StringBuffer和StringBuider也可以被當(dāng)做構(gòu)造String的參數(shù)。

Java Java 7 源碼學(xué)習(xí)系列(一)——String

當(dāng)然,,這兩個(gè)構(gòu)造方法是很少用到的,,至少我從來沒有使用過,因?yàn)楫?dāng)我們有了StringBuffer或者StringBuilfer對(duì)象之后可以直接使用他們的toString方法來得到String,。關(guān)于效率問題,,Java的官方文檔有提到說使用StringBuilder的toString方法會(huì)更快一些,原因是StringBuffer的toString方法是synchronized的,,在犧牲了效率的情況下保證了線程安全,。

Java Java 7 源碼學(xué)習(xí)系列(一)——String

4.一個(gè)特殊的保護(hù)類型的構(gòu)造方法

String除了提供了很多公有的供程序員使用的構(gòu)造方法以外,還提供了一個(gè)保護(hù)類型的構(gòu)造方法(Java 7),,我們看一下他是怎么樣的:

Java Java 7 源碼學(xué)習(xí)系列(一)——String

從代碼中我們可以看出,,該方法和 String(char[] value)有兩點(diǎn)區(qū)別,第一個(gè),,該方法多了一個(gè)參數(shù): boolean share,,其實(shí)這個(gè)參數(shù)在方法體中根本沒被使用,也給了注釋,,目前不支持使用false,,只使用true。那么可以斷定,,加入這個(gè)share的只是為了區(qū)分于String(char[] value)方法,,不加這個(gè)參數(shù)就沒辦法定義這個(gè)函數(shù),只有參數(shù)不能才能進(jìn)行重載,。那么,第二個(gè)區(qū)別就是具體的方法實(shí)現(xiàn)不同,。我們前面提到過,,String(char[] value)方法在創(chuàng)建String的時(shí)候會(huì)用到 會(huì)用到ArrayscopyOf方法將value中的內(nèi)容逐一復(fù)制到String當(dāng)中,而這個(gè)String(char[] value, boolean share)方法則是直接將value的引用賦值給String的value,。那么也就是說,,這個(gè)方法構(gòu)造出來的String和參數(shù)傳過來的char[] value共享同一個(gè)數(shù)組,。 那么,為什么Java會(huì)提供這樣一個(gè)方法呢,? 首先,,我們分析一下使用該構(gòu)造函數(shù)的好處:

首先,性能好,,這個(gè)很簡(jiǎn)單,,一個(gè)是直接給數(shù)組賦值(相當(dāng)于直接將String的value的指針指向char[]數(shù)組),一個(gè)是逐一拷貝,。當(dāng)然是直接賦值快了,。

其次,共享內(nèi)部數(shù)組節(jié)約內(nèi)存

但是,,該方法之所以設(shè)置為protected,,是因?yàn)橐坏┰摲椒ㄔO(shè)置為公有,在外面可以訪問的話,,那就破壞了字符串的不可變性,。例如如下YY情形:

Java Java 7 源碼學(xué)習(xí)系列(一)——String

如果構(gòu)造方法沒有對(duì)arr進(jìn)行拷貝,那么其他人就可以在字符串外部修改該數(shù)組,,由于它們引用的是同一個(gè)數(shù)組,,因此對(duì)arr的修改就相當(dāng)于修改了字符串。

所以,,從安全性角度考慮,,他也是安全的。對(duì)于調(diào)用他的方法來說,,由于無論是原字符串還是新字符串,,其value數(shù)組本身都是String對(duì)象的私有屬性,從外部是無法訪問的,,因此對(duì)兩個(gè)字符串來說都很安全,。

在Java 7 之有很多String里面的方法都使用這種“性能好的、節(jié)約內(nèi)存的,、安全”的構(gòu)造函數(shù),。比如:substringreplace,、concat,、valueOf等方法(實(shí)際上他們使用的是public String(char[], int, int)方法,原理和本方法相同,,已經(jīng)被本方法取代),。

但是在Java 7中,substring已經(jīng)不再使用這種“優(yōu)秀”的方法了,為什么呢,? 雖然這種方法有很多優(yōu)點(diǎn),,但是他有一個(gè)致命的缺點(diǎn),對(duì)于sun公司的程序員來說是一個(gè)零容忍的bug,,那就是他很有可能造成內(nèi)存泄露,。 看一個(gè)例子,假設(shè)一個(gè)方法從某個(gè)地方(文件,、數(shù)據(jù)庫或網(wǎng)絡(luò))取得了一個(gè)很長(zhǎng)的字符串,,然后對(duì)其進(jìn)行解析并提取其中的一小段內(nèi)容,這種情況經(jīng)常發(fā)生在網(wǎng)頁抓取或進(jìn)行日志分析的時(shí)候,。下面是示例代碼,。

Java Java 7 源碼學(xué)習(xí)系列(一)——String

在這里aLongString只是臨時(shí)的,真正有用的是aPart,,其長(zhǎng)度只有20個(gè)字符,,但是它的內(nèi)部數(shù)組卻是從aLongString那里共享的,因此雖然aLongString本身可以被回收,,但它的內(nèi)部數(shù)組卻不能(如下圖),。這就導(dǎo)致了內(nèi)存泄漏。如果一個(gè)程序中這種情況經(jīng)常發(fā)生有可能會(huì)導(dǎo)致嚴(yán)重的后果,,如內(nèi)存溢出,,或性能下降。

Java Java 7 源碼學(xué)習(xí)系列(一)——String

新的實(shí)現(xiàn)雖然損失了性能,,而且浪費(fèi)了一些存儲(chǔ)空間,,但卻保證了字符串的內(nèi)部數(shù)組可以和字符串對(duì)象一起被回收,從而防止發(fā)生內(nèi)存泄漏,,因此新的substring比原來的更健壯,。

額、,、,、扯了好遠(yuǎn),雖然substring方法已經(jīng)為了其魯棒性放棄使用這種share數(shù)組的方法,,但是這種share數(shù)組的方法還是有一些其他方法在使用的,,這是為什么呢?首先呢,,這種方式構(gòu)造對(duì)應(yīng)有很多好處,,其次呢,其他的方法不會(huì)將數(shù)組長(zhǎng)度變短,,也就不會(huì)有前面說的那種內(nèi)存泄露的情況(內(nèi)存泄露是指不用的內(nèi)存沒有辦法被釋放,,比如說concat方法和replace方法,,他們不會(huì)導(dǎo)致元數(shù)組中有大量空間不被使用,,因?yàn)樗麄円粋€(gè)是拼接字符串,,一個(gè)是替換字符串內(nèi)容,不會(huì)將字符數(shù)組的長(zhǎng)度變得很短?。?。

四、其他方法

length() 返回字符串長(zhǎng)度

isEmpty() 返回字符串是否為空

charAt(int index) 返回字符串中第(index+1)個(gè)字符

char[] toCharArray() 轉(zhuǎn)化成字符數(shù)組

trim() 去掉兩端空格

toUpperCase() 轉(zhuǎn)化為大寫

toLowerCase() 轉(zhuǎn)化為小寫

String concat(String str) //拼接字符串

String replace(char oldChar, char newChar) //將字符串中的oldChar字符換成newChar字符

//以上兩個(gè)方法都使用了String(char[] value, boolean share),;

boolean matches(String regex) //判斷字符串是否匹配給定的regex正則表達(dá)式

boolean contains(CharSequence s) //判斷字符串是否包含字符序列s

String[] split(String regex, int limit) 按照字符regex將字符串分成limit份,。

String[] split(String regex)

Java Java 7 源碼學(xué)習(xí)系列(一)——String

getBytes

在創(chuàng)建String的時(shí)候,可以使用byte[]數(shù)組,,將一個(gè)字節(jié)數(shù)組轉(zhuǎn)換成字符串,,同樣,我們可以將一個(gè)字符串轉(zhuǎn)換成字節(jié)數(shù)組,,那么String提供了很多重載的getBytes方法,。但是,值得注意的是,,在使用這些方法的時(shí)候一定要注意編碼問題,。比如:

Java Java 7 源碼學(xué)習(xí)系列(一)——String

這段代碼在不同的平臺(tái)上運(yùn)行得到結(jié)果是不一樣的。由于我們沒有指定編碼方式,,所以在該方法對(duì)字符串進(jìn)行編碼的時(shí)候就會(huì)使用系統(tǒng)的默認(rèn)編碼方式,,比如在中文操作系統(tǒng)中可能會(huì)使用GBK或者GB2312進(jìn)行編碼,在英文操作系統(tǒng)中有可能使用iso-8859-1進(jìn)行編碼,。這樣寫出來的代碼就和機(jī)器環(huán)境有很強(qiáng)的關(guān)聯(lián)性了,,所以,為了避免不必要的麻煩,,我們要指定編碼方式,。如使用以下方式:

Java Java 7 源碼學(xué)習(xí)系列(一)——String

比較方法

Java Java 7 源碼學(xué)習(xí)系列(一)——String

字符串有一系列方法用于比較兩個(gè)字符串的關(guān)系。 前四個(gè)返回boolean的方法很容易理解,,前三個(gè)比較就是比較String和要比較的目標(biāo)對(duì)象的字符數(shù)組的內(nèi)容,,一樣就返回true,不一樣就返回false,核心代碼如下:

Java Java 7 源碼學(xué)習(xí)系列(一)——String

v1 v2分別代表String的字符數(shù)組和目標(biāo)對(duì)象的字符數(shù)組,。 第四個(gè)和前三個(gè)唯一的區(qū)別就是他會(huì)將兩個(gè)字符數(shù)組的內(nèi)容都使用toUpperCase方法轉(zhuǎn)換成大寫再進(jìn)行比較,,以此來忽略大小寫進(jìn)行比較。相同則返回true,,不想同則返回false

在這里,,看到這幾個(gè)比較的方法代碼,有很多編程的技巧我們應(yīng)該學(xué)習(xí),。我們看equals方法:

Java Java 7 源碼學(xué)習(xí)系列(一)——String

該方法首先判斷this == anObject ,?,,也就是說判斷要比較的對(duì)象和當(dāng)前對(duì)象是不是同一個(gè)對(duì)象,如果是直接返回true,,如不是再繼續(xù)比較,,然后在判斷anObject是不是String類型的,如果不是,,直接返回false,如果是再繼續(xù)比較,,到了能終于比較字符數(shù)組的時(shí)候,他還是先比較了兩個(gè)數(shù)組的長(zhǎng)度,,不一樣直接返回false,,一樣再逐一比較值。 雖然代碼寫的內(nèi)容比較多,,但是可以很大程度上提高比較的效率,。值得學(xué)習(xí)~~!??!

contentEquals有兩個(gè)重載,StringBuffer需要考慮線程安全問題,,再加鎖之后調(diào)用contentEquals((CharSequence) sb)方法,。contentEquals((CharSequence) sb)則分兩種情況,一種是cs instanceof AbstractStringBuilder,,另外一種是參數(shù)是String類型,。具體比較方式幾乎和equals方法類似,先做“宏觀”比較,,在做“微觀”比較,。

下面這個(gè)是equalsIgnoreCase代碼的實(shí)現(xiàn):

Java Java 7 源碼學(xué)習(xí)系列(一)——String

看到這段代碼,眼前為之一亮,。使用一個(gè)三目運(yùn)算符和&&操作代替了多個(gè)if語句,。

hashCode

hashCode的實(shí)現(xiàn)其實(shí)就是使用數(shù)學(xué)公式:

Java Java 7 源碼學(xué)習(xí)系列(一)——String

s[i]是string的第i個(gè)字符,,n是String的長(zhǎng)度,。那為什么這里用31,而不是其它數(shù)呢? 計(jì)算機(jī)的乘法涉及到移位計(jì)算,。當(dāng)一個(gè)數(shù)乘以2時(shí),,就直接拿該數(shù)左移一位即可,!選擇31原因是因?yàn)?1是一個(gè)素?cái)?shù)!

所謂素?cái)?shù):

質(zhì)數(shù)又稱素?cái)?shù),。指在一個(gè)大于1的自然數(shù)中,,除了1和此整數(shù)自身外,沒法被其他自然數(shù)整除的數(shù),。

素?cái)?shù)在使用的時(shí)候有一個(gè)作用就是如果我用一個(gè)數(shù)字來乘以這個(gè)素?cái)?shù),,那么最終的出來的結(jié)果只能被素?cái)?shù)本身和被乘數(shù)還有1來整除,!如:我們選擇素?cái)?shù)3來做系數(shù),那么3*n只能被3和n或者1來整除,,我們可以很容易的通過3n來計(jì)算出這個(gè)n來,。這應(yīng)該也是一個(gè)原因! (本段表述有問題,,感謝 @沉淪 的提醒)

在存儲(chǔ)數(shù)據(jù)計(jì)算hash地址的時(shí)候,,我們希望盡量減少有同樣的hash地址,所謂“沖突”,。如果使用相同hash地址的數(shù)據(jù)過多,那么這些數(shù)據(jù)所組成的hash鏈就更長(zhǎng),,從而降低了查詢效率,!所以在選擇系數(shù)的時(shí)候要選擇盡量長(zhǎng)的系數(shù)并且讓乘法盡量不要溢出的系數(shù),因?yàn)槿绻?jì)算出來的hash地址越大,,所謂的“沖突”就越少,,查找起來效率也會(huì)提高。

31可以 由i*31== (i<>

在java乘法中如果數(shù)字相乘過大會(huì)導(dǎo)致溢出的問題,,從而導(dǎo)致數(shù)據(jù)的丟失.

而31則是素?cái)?shù)(質(zhì)數(shù))而且不是很長(zhǎng)的數(shù)字,,最終它被選擇為相乘的系數(shù)的原因不過與此!

在Java中,,整型數(shù)是32位的,,也就是說最多有2^32= 4294967296個(gè)整數(shù),將任意一個(gè)字符串,,經(jīng)過hashCode計(jì)算之后,,得到的整數(shù)應(yīng)該在這4294967296數(shù)之中。那么,,最多有 4294967297個(gè)不同的字符串作hashCode之后,,肯定有兩個(gè)結(jié)果是一樣的, hashCode可以保證相同的字符串的hash值肯定相同,但是,,hash值相同并不一定是value值就相同,。

substring

Java Java 7 源碼學(xué)習(xí)系列(一)——String

前面我們介紹過,java 7 中的substring方法使用String(value, beginIndex, subLen)方法創(chuàng)建一個(gè)新的String并返回,,這個(gè)方法會(huì)將原來的char[]中的值逐一復(fù)制到新的String中,,兩個(gè)數(shù)組并不是共享的,雖然這樣做損失一些性能,,但是有效地避免了內(nèi)存泄露,。

replaceFirst、replaceAll,、replace區(qū)別

Java Java 7 源碼學(xué)習(xí)系列(一)——String

1)replace的參數(shù)是char和CharSequence,即可以支持字符的替換,也支持字符串的替換 2)replaceAll和replaceFirst的參數(shù)是regex,即基于規(guī)則表達(dá)式的替換,比如,可以通過replaceAll(“\d”, “*”)把一個(gè)字符串所有的數(shù)字字符都換成星號(hào); 相同點(diǎn)是都是全部替換,即把源字符串中的某一字符或字符串全部換成指定的字符或字符串, 如果只想替換第一次出現(xiàn)的,可以使用 replaceFirst(),這個(gè)方法也是基于規(guī)則表達(dá)式的替換,但與replaceAll()不同的是,只替換第一次出現(xiàn)的字符串; 另外,如果replaceAll()和replaceFirst()所用的參數(shù)據(jù)不是基于規(guī)則表達(dá)式的,則與replace()替換字符串的效果是一樣的,即這兩者也支持字符串的操作;

copyValueOf 和 valueOf

String的底層是由char[]實(shí)現(xiàn)的:通過一個(gè)char[]類型的value屬性,!早期的String構(gòu)造器的實(shí)現(xiàn)呢,,不會(huì)拷貝數(shù)組的,直接將參數(shù)的char[]數(shù)組作為String的value屬性,。然后test[0] = 'A';將導(dǎo)致字符串的變化,。為了避免這個(gè)問題,提供了copyValueOf方法,,每次都拷貝成新的字符數(shù)組來構(gòu)造新的String對(duì)象,。但是現(xiàn)在的String對(duì)象,在構(gòu)造器中就通過拷貝新數(shù)組實(shí)現(xiàn)了,,所以這兩個(gè)方面在本質(zhì)上已經(jīng)沒區(qū)別了,。

valueOf()有很多種形式的重載,包括:

Java Java 7 源碼學(xué)習(xí)系列(一)——String

可以看到這些方法可以將六種基本數(shù)據(jù)類型的變量轉(zhuǎn)換成String類型,。

intern()方法

Java Java 7 源碼學(xué)習(xí)系列(一)——String

該方法返回一個(gè)字符串對(duì)象的內(nèi)部化引用,。 眾所周知:String類維護(hù)一個(gè)初始為空的字符串的對(duì)象池,當(dāng)intern方法被調(diào)用時(shí),,如果對(duì)象池中已經(jīng)包含這一個(gè)相等的字符串對(duì)象則返回對(duì)象池中的實(shí)例,,否則添加字符串到對(duì)象池并返回該字符串的引用。

String對(duì)“+”的重載

我們知道,,Java是不支持重載運(yùn)算符,,String的“+”是java中唯一的一個(gè)重載運(yùn)算符,那么java使如何實(shí)現(xiàn)這個(gè)加號(hào)的呢,?我們先看一段代碼:

Java Java 7 源碼學(xué)習(xí)系列(一)——String

然后我們將這段代碼反編譯:

Java Java 7 源碼學(xué)習(xí)系列(一)——String

看了反編譯之后的代碼我們發(fā)現(xiàn),,其實(shí)String對(duì)“+”的支持其實(shí)就是使用了StringBuilder以及他的append、toString兩個(gè)方法,。

String.valueOf和Integer.toString的區(qū)別

接下來我們看以下這段代碼,,我們有三種方式將一個(gè)int類型的變量變成呢過String類型,那么他們有什么區(qū)別,?

Java Java 7 源碼學(xué)習(xí)系列(一)——String

1,、第三行和第四行沒有任何區(qū)別,因?yàn)?code>String.valueOf(i)也是調(diào)用Integer.toString(i)來實(shí)現(xiàn)的,。 2,、第二行代碼其實(shí)是String i1 = (new StringBuilder()).append(i).toString();,首先創(chuàng)建一個(gè)StringBuilder對(duì)象,,然后再調(diào)用append方法,,再調(diào)用toString方法。

學(xué)習(xí)Java的同學(xué)注意了?。,。?/p>

學(xué)習(xí)過程中遇到什么問題或者想獲取學(xué)習(xí)資源的話,,歡迎加入Java學(xué)習(xí)交流,,裙號(hào)碼:253772578【長(zhǎng)按復(fù)制】 我們一起學(xué)Java,!

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,,不代表本站觀點(diǎn),。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,,謹(jǐn)防詐騙,。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào),。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多