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

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

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

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

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

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

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

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

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

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

溫馨提示

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

評論

0/150

提交評論