<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆 - 44  文章 - 78  trackbacks - 0
    <2007年11月>
    28293031123
    45678910
    11121314151617
    18192021222324
    2526272829301
    2345678

     Happy 牛 Year
    一、一周至少寫一篇博文;
    二、每天至少學習半個小時。
    三、奔向小牛!

    常用鏈接

    留言簿(6)

    我參與的團隊

    隨筆分類

    隨筆檔案

    文章檔案

    搜索

    •  

    最新評論

    閱讀排行榜

    評論排行榜

    首先把問題擺出來,先看這個代碼

    String a = "ab";
                            String b = "a" + "b";
                            System.out.println((a == b));

    打印結果會是什么?類似這樣的問題,有人考過我,我也拿來考過別人(蠻好玩的,大家也可以拿來問人玩),一般答案會是以下幾種:

    1.true

    "a" + "b" 的結果就是"ab",這樣a,b都是"ab"了,內容一樣所以"相等",結果true

    一般java新人如是答。

    2.false

    "a" + "a"會生成新的對象"aa",但是這個對象和String a = "ab";不同,(a == b)是比較對象引用,因此不相等,結果false

    對java的String有一定了解的通常這樣回答。

    3.true

    String a = "ab";創建了新的對象"ab"; 再執行String b = "a" + "b";結果b="ab",這里沒有創建新的對象,而是從JVM字符串常量池中獲取之前已經存在的"ab"對象。因此a,b具有對同一個string對象的引用,兩個引用相等,結果true.

    能回答出這個答案的,基本已經是高手了,對java中的string機制比較了解。

    很遺憾,這個答案,是不夠準確的。或者說,根本沒有運行時計算b = "a" + "b";這個操作.實際上運行時只有String b = "ab";

    3的觀點適合解釋以下情況:

    String a = "ab";
                            String b = "ab";
                            System.out.println((a == b));

    如果String b = "a" + "b";是在運行期執行,則3的觀點是無法解釋的。運行期的兩個string相加,會產生新的對象的。(本文后面對此有解釋)

    4.true

    下面是我的回答:編譯優化+ 3的處理方式 = 最后的true

    String b = "a" + "b";編譯器將這個"a" + "b"作為常量表達式,在編譯時進行優化,直接取結果"ab",這樣這個問題退化

    String a = "ab";
                            String b = "ab";
                            System.out.println((a == b));

    然后根據3的解釋,得到結果true

    這里有一個疑問就是String不是基本類型,像

    int secondsOfDay = 24 * 60 * 60;

    這樣的表達式是常量表達式,編譯器在編譯時直接計算容易理解,而"a" + "b" 這樣的表達式,string是對象不是基本類型,編譯器會把它當成常量表達式來優化嗎?

    下面簡單證明我的推斷,首先編譯這個類:

    public class Test {
                            private String a = "aa";
                            }

    復制class文件備用,然后修改為

    public class Test {
                            private String a = "a" + "a";
                            }

    再次編譯,用ue之類的文本編輯器打開,察看二進制內容,可以發現,兩個class文件完全一致,連一個字節都不差.

    ok,真相大白了.根本不存在運行期的處理String b = "a" + "b";這樣的代碼的問題,編譯時就直接優化掉了。

    下面進一步探討,什么樣的string + 表達式會被編譯器當成常量表達式?

    String b = "a" + "b";

    這個String + String被正式是ok的,那么string + 基本類型呢?

    String a = "a1";
                            String b = "a" + 1;
                            System.out.println((a == b)); //result = true
                            String a = "atrue";
                            String b = "a" + true;
                            System.out.println((a == b)); //result = true
                            String a = "a3.4";
                            String b = "a" + 3.4;
                            System.out.println((a == b)); //result = true

    可見編譯器對string + 基本類型是當成常量表達式直接求值來優化的。

    再注意看這里的string都是"**"這樣的,我們換成變量來試試:

    String a = "ab";
                            String bb = "b";
                            String b = "a" + bb;
                            System.out.println((a == b)); //result = false

    這個好理解,"a" + bb中的bb是變量,不能進行優化。這里很很好的解釋了為什么3的觀點不正確,如果String+String的操作是在運行時進行的,則會產生新的對象,而不是直接從jvm的string池中獲取。

    再修改一下,把bb作為常量變量:

    String a = "ab";
                            final String bb = "b";
                            String b = "a" + bb;
                            System.out.println((a == b)); //result = true

    竟然又是true,編譯器的優化好厲害啊,呵呵,考慮下面這種情況:

    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(包括編譯器和jvm)對string的優化,真的是到了極點了,string這個所謂的"對象",完全不可以看成一般的對象,java對string的處理近乎于基本類型,最大限度的優化了幾乎能優化的地方。

    另外感嘆一下,string的+號處理,算是java語言里面唯一的一個"運算符重載"(接觸過c++的人對這個不會陌生)吧?


    來源:賽迪網技術社區    作者:dxaw
    posted on 2007-11-20 09:52 Tiger1102 閱讀(253) 評論(0)  編輯  收藏 所屬分類: 每日進階
    主站蜘蛛池模板: 成人伊人亚洲人综合网站222| 亚洲精品国产手机| 亚洲日韩av无码| 亚洲综合一区二区国产精品| 亚洲丝袜中文字幕| 国产精品亚洲综合网站| 国内永久免费crm系统z在线| 免费视频专区一国产盗摄| 国产免费久久精品| 亚洲AV成人一区二区三区AV| 国产精品亚洲片在线va| 亚洲第一视频在线观看免费| 美丽的姑娘免费观看在线播放| 在线观看成人免费| 国产亚洲色婷婷久久99精品| 亚洲精品无码成人| 美女视频黄的免费视频网页 | 中国一级特黄高清免费的大片中国一级黄色片 | 国产亚洲福利一区二区免费看| 怡红院免费全部视频在线视频| 一本岛高清v不卡免费一三区| 亚洲高清无码综合性爱视频| 亚洲人成在线影院| 看全免费的一级毛片| 3344永久在线观看视频免费首页 | 亚洲邪恶天堂影院在线观看| 国产精品亚洲天堂| 国产精品入口麻豆免费观看| 在线亚洲午夜理论AV大片| 亚洲熟伦熟女专区hd高清| 2020因为爱你带字幕免费观看全集 | 国产精品国产午夜免费福利看| 夜夜亚洲天天久久| ssswww日本免费网站片| 夫妻免费无码V看片| 在线观看亚洲人成网站| 很黄很污的网站免费| 亚洲国产精品成人久久蜜臀 | 特级毛片全部免费播放a一级| 久久午夜伦鲁片免费无码 | 亚洲国产综合91精品麻豆|