Java編譯器中對(duì)String對(duì)象的優(yōu)化_第1頁(yè)
Java編譯器中對(duì)String對(duì)象的優(yōu)化_第2頁(yè)
Java編譯器中對(duì)String對(duì)象的優(yōu)化_第3頁(yè)
Java編譯器中對(duì)String對(duì)象的優(yōu)化_第4頁(yè)
全文預(yù)覽已結(jié)束

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、Java編譯器中對(duì)String對(duì)象的優(yōu)化作者:佚名來(lái)源:網(wǎng)絡(luò)2009年9月17日發(fā)表評(píng)論進(jìn)入社區(qū)     Java編譯器中對(duì)String對(duì)象的優(yōu)化    首先把問(wèn)題擺出來(lái),先看這個(gè)代碼:    打印結(jié)果會(huì)是什么?類似這樣的問(wèn)題,有人考過(guò)我,我也拿來(lái)考過(guò)別人(蠻好玩的,大家也可以拿來(lái)問(wèn)人玩),一般答案會(huì)是以下幾種:    1、true    "a" + "b" 的結(jié)果就是"ab",這樣a,

2、b都是"ab"了,內(nèi)容一樣所以"相等",結(jié)果true.    一般Java新人如是答。    2、false    "a" + "a"會(huì)生成新的對(duì)象"aa",但是這個(gè)對(duì)象和String a = "ab"不同,(a = b)是比較對(duì)象引用,因此不相等,結(jié)果false.    對(duì)Java的String有一定了解的通常這樣回答。   

3、 3、true    String a = "ab"創(chuàng)建了新的對(duì)象"ab"再執(zhí)行String b = "a" + "b"結(jié)果b="ab",這里沒(méi)有創(chuàng)建新的對(duì)象,而是從JVM字符串常量池中獲取之前已經(jīng)存在的"ab"對(duì)象。因此a,b具有對(duì)同一個(gè)string對(duì)象的引用,兩個(gè)引用相等,結(jié)果true.    能回答出這個(gè)答案的,基本已經(jīng)是高手了,對(duì)Java中的string機(jī)制比較了解。    很遺

4、憾,這個(gè)答案是不夠準(zhǔn)確的?;蛘哒f(shuō),根本沒(méi)有運(yùn)行時(shí)計(jì)算b = "a" + "b"這個(gè)操作。實(shí)際上運(yùn)行時(shí)只有String b = "ab".    3的觀點(diǎn)適合解釋以下情況:    如果String b = "a" + "b"是在運(yùn)行期執(zhí)行,則3的觀點(diǎn)是無(wú)法解釋的。運(yùn)行期的兩個(gè)string相加,會(huì)產(chǎn)生新的對(duì)象的。(本文后面對(duì)此有解釋)    4、true    下面是我的回答:編譯

5、優(yōu)化+ 3的處理方式 = 最后的true    String b = "a" + "b"編譯器將這個(gè)"a" + "b"作為常量表達(dá)式,在編譯時(shí)進(jìn)行優(yōu)化,直接取結(jié)果"ab",這樣這個(gè)問(wèn)題退化。    然后根據(jù)3的解釋,得到結(jié)果true.    這里有一個(gè)疑問(wèn)就是String不是基本類型,像    int secondsOfDay = 24 * 60 * 60; 

6、0;  這樣的表達(dá)式是常量表達(dá)式,編譯器在編譯時(shí)直接計(jì)算容易理解,而"a" + "b" 這樣的表達(dá)式,string是對(duì)象不是基本類型,編譯器會(huì)把它當(dāng)成常量表達(dá)式來(lái)優(yōu)化嗎?下面簡(jiǎn)單證明我的推斷,首先編譯這個(gè)類:    public class Test private String a = "aa"     復(fù)制class文件備用,然后修改為:    public class Test private String a = "a

7、" + "a"     再次編譯,用ue之類的文本編輯器打開(kāi),察看二進(jìn)制內(nèi)容,可以發(fā)現(xiàn),兩個(gè)class文件完全一致,連一個(gè)字節(jié)都不差。    ok,真相大白了。根本不存在運(yùn)行期的處理String b = "a" + "b"這樣的代碼的問(wèn)題,編譯時(shí)就直接優(yōu)化掉了。    下面進(jìn)一步探討,什么樣的string + 表達(dá)式會(huì)被編譯器當(dāng)成常量表達(dá)式?    String b = "a" + &q

8、uot;b"    這個(gè)String + String被正式是ok的,那么string + 基本類型呢?    可見(jiàn)編譯器對(duì)string + 基本類型是當(dāng)成常量表達(dá)式直接求值來(lái)優(yōu)化的。    再注意看這里的string都是"*"這樣的,我們換成變量來(lái)試試:    這個(gè)好理解,"a" + bb中的bb是變量,不能進(jìn)行優(yōu)化。這里很很好的解釋了為什么3的觀點(diǎn)不正確,如果String+String的操作是在運(yùn)行時(shí)進(jìn)行的,則會(huì)產(chǎn)生新的對(duì)象,而不是直接從jvm的string池中獲取。    再修改一下,把bb作為常量變量:    竟然又是true,編譯器的優(yōu)化好厲害啊!呵呵!考慮下面這種情況:    看來(lái)Java(包括編譯器和jvm)對(duì)string的優(yōu)化,真的是到了極點(diǎn)了,string這個(gè)所謂的"對(duì)象",完全不可

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論