



下載本文檔
版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
1、Java編譯器中對String對象的優(yōu)化作者:佚名來源:網(wǎng)絡2009年9月17日發(fā)表評論進入社區(qū) Java編譯器中對String對象的優(yōu)化 首先把問題擺出來,先看這個代碼: String a = "ab" String b = "a" + "b" System.out.println(a = b); 打印結果會是什么?類似這樣的問題,有人考過我,我也拿來考過別人(蠻好玩的,大家也可以拿來問人
2、玩),一般答案會是以下幾種: 1、true "a" + "b" 的結果就是"ab",這樣a,b都是"ab"了,內(nèi)容一樣所以"相等",結果true. 一般Java新人如是答。 2、false "a" + "a"會生成新的對象"aa",但是這個對象和String
3、a = "ab"不同,(a = b)是比較對象引用,因此不相等,結果false. 對Java的String有一定了解的通常這樣回答。 3、true String a = "ab"創(chuàng)建了新的對象"ab"再執(zhí)行String b = "a" + "b"結果b="ab",這里沒有創(chuàng)建新的對象,而是從JVM字符串常量池中獲取之前已經(jīng)存在的"ab"對象。因此a,
4、b具有對同一個string對象的引用,兩個引用相等,結果true. 能回答出這個答案的,基本已經(jīng)是高手了,對Java中的string機制比較了解。 很遺憾,這個答案是不夠準確的。或者說,根本沒有運行時計算b = "a" + "b"這個操作。實際上運行時只有String b = "ab". 3的觀點適合解釋以下情況: String a = "ab" String b = &q
5、uot;ab" System.out.println(a = b); 如果String b = "a" + "b"是在運行期執(zhí)行,則3的觀點是無法解釋的。運行期的兩個string相加,會產(chǎn)生新的對象的。(本文后面對此有解釋) 4、true 下面是我的回答:編譯優(yōu)化+ 3的處理方式 = 最后的true String b = "a" + "b"編譯器將這個"
6、a" + "b"作為常量表達式,在編譯時進行優(yōu)化,直接取結果"ab",這樣這個問題退化。 String a = "ab" String b = "ab" System.out.println(a = b); 然后根據(jù)3的解釋,得到結果true. 這里有一個疑問就是String不是基本類型,像 int secondsOfDay = 24 * 60 * 60;
7、0; 這樣的表達式是常量表達式,編譯器在編譯時直接計算容易理解,而"a" + "b" 這樣的表達式,string是對象不是基本類型,編譯器會把它當成常量表達式來優(yōu)化嗎?下面簡單證明我的推斷,首先編譯這個類: public class Test private String a = "aa" 復制class文件備用,然后修改為: public class Test private String a = &
8、quot;a" + "a" 再次編譯,用ue之類的文本編輯器打開,察看二進制內(nèi)容,可以發(fā)現(xiàn),兩個class文件完全一致,連一個字節(jié)都不差。 ok,真相大白了。根本不存在運行期的處理String b = "a" + "b"這樣的代碼的問題,編譯時就直接優(yōu)化掉了。 下面進一步探討,什么樣的string + 表達式會被編譯器當成常量表達式? String b = "a"
9、; + "b" 這個String + String被正式是ok的,那么string + 基本類型呢? String a = "a1" String b = "a" + 1; System.out.println(a = b); /result = trueString a = "atrue" String b = "a" + true; System.out.println(a = b); /result = trueStr
10、ing a = "a3.4" String b = "a" + 3.4; System.out.println(a = b); /result = true 可見編譯器對string + 基本類型是當成常量表達式直接求值來優(yōu)化的。 再注意看這里的string都是"*"這樣的,我們換成變量來試試: String a = "ab" String bb = "b" String b = &quo
11、t;a" + bb; System.out.println(a = b); /result = false 這個好理解,"a" + bb中的bb是變量,不能進行優(yōu)化。這里很很好的解釋了為什么3的觀點不正確,如果String+String的操作是在運行時進行的,則會產(chǎn)生新的對象,而不是直接從jvm的string池中獲取。 再修改一下,把bb作為常量變量: String a = "ab" final String bb = "b&q
12、uot; String b = "a" + bb; System.out.println(a = b); /result = true 竟然又是true,編譯器的優(yōu)化好厲害??!呵呵!考慮下面這種情況: String a = "ab" final String bb = getBB(); String b = "a" + bb; System.out.println(a = b); /result = false private static String getBB() return "b" 看來Java(包括編譯
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 主播上崗考試題及答案
- 靜物寫生素描考試題及答案
- 宣傳接待崗面試題及答案
- 廣東省廣州市番禺育才2022-2023學年八年級下學期期中考試物理試題(含答案)
- 抗體檢驗知識培訓課件
- 創(chuàng)新型醫(yī)療器械研發(fā)協(xié)議
- 關于職場軟技能培養(yǎng)的建議與反思
- 小學生科學知識讀物征文
- 員工技能培訓安排表
- 全球教育資源分布及質量評估表
- 信息系統(tǒng)應急響應計劃制定指南考核試卷
- 酒店消防安全知識培訓試題及答案
- 2024解析:第四章光現(xiàn)象-講核心(解析版)
- 2024解析:第十九章生活用電-講核心(解析版)
- BRC+Food+Safety+Standard+2024年培訓課件全攻略
- 《公路橋梁掛籃設計與施工技術指南》
- 建筑工地安全風險分級管控方案
- 供熱管網(wǎng)維保服務方案
- 現(xiàn)代家政導論-課件 4.1.1認識家政教育及意義
- 浙江省【高等職業(yè)技術教育招生考試】-商業(yè)類(電子商務)-職業(yè)技能理論知識(一)(答案版)
- 人教版小學六年級下冊音樂教案全冊
評論
0/150
提交評論