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

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

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

    ZT文萃

    本博不原創(chuàng),轉(zhuǎn)帖自己感興趣那些事人物,什么入眼貼什么,隨心所欲。
    posts - 93, comments - 5, trackbacks - 0, articles - 0
      BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

    轉(zhuǎn)帖:再解Java中的String

    Posted on 2014-05-04 06:10 ZT文萃 閱讀(223) 評論(0)  編輯  收藏 所屬分類: 中間件

    轉(zhuǎn)帖:

    http://www.cnblogs.com/chenssy/p/3695271.html
    版權(quán)歸作者所有。


         今天朋友問我String的內(nèi)容是真的不可變嗎?我肯定告訴他是的?因為在我的主觀意識里String就是一個不可變的對象。于是他給我發(fā)了這段程序:

    復(fù)制代碼
    public class StringTest {     public static void main(String[] args) throws Exception {         String a = "chenssy";         System.out.println("a = " + a);         Field a_ = String.class.getDeclaredField("value");         a.setAccessible(true);         char[] value=(char[])a.get(a);         value[4]='_';   //修改a所指向的值         System.out.println("a = " + a);     } }
    復(fù)制代碼

          看到這個簡單的程序,我笑了,你這不是從底層來修改String的值么?從這里來理解String的值肯定是可以改變的啦(我們應(yīng)該始終相信String的不可變性)!接著他再給我一段程序:

    復(fù)制代碼
    public class StringTest {     public static void main(String[] args) throws Exception {         String a = "chenssy";         String b = "chenssy";         String c = new String("chenssy");         System.out.println("--------------修改前值-------------------");         System.out.println("a = " + a);         System.out.println("b = " + b);         System.out.println("c = " + c);         //修改String的值         Field a_ = String.class.getDeclaredField("value");         a_.setAccessible(true);         char[] value=(char[])a_.get(a);         value[4]='_';   //修改a所指向的值                  System.out.println("--------------修改后值-------------------");         System.out.println("a = " + a);         System.out.println("b = " + b);         System.out.println("chenssy");         System.out.println("c = " + c);     } }
    復(fù)制代碼

          乍看這程序是異常的簡單,無非就是賦值、改值、輸出嘛!可能你現(xiàn)在就會毫不猶豫的說太簡單了結(jié)果就是……。但是!!你的毫不猶豫會害死你,而且你的結(jié)果很可能錯誤。那么運行結(jié)果是什么呢?

    復(fù)制代碼
    --------------修改前值------------------- a = chenssy b = chenssy c = chenssy --------------修改后值------------------- a = chen_sy b = chen_sy chen_sy c = chen_ssy
    復(fù)制代碼

          修改前值很容易理解,但是修改后值呢?是不是有點兒不理解呢?你可能會問:為什么System.out.println("chenssy");的結(jié)果會是chen_ssy,System.out.println("c = " + c);也是chen_ssy呢?

          要明白這個其實也比較簡單,掌握一個知識點:字符串常量池。

          我們知道字符串的分配和其他對象分配一樣,是需要消耗高昂的時間和空間的,而且字符串我們使用的非常多。JVM為了提高性能和減少內(nèi)存的開銷,在實例化字 符串的時候進(jìn)行了一些優(yōu)化:使用字符串常量池。每當(dāng)我們創(chuàng)建字符串常量時,JVM會首先檢查字符串常量池,如果該字符串已經(jīng)存在常量池中,那么就直接返回 常量池中的實例引用。如果字符串不存在常量池中,就會實例化該字符串并且將其放到常量池中。由于String字符串的不可變性我們可以十分肯定常量池中一定不存在兩個相同的字符串(這點對理解上面至關(guān)重要)。

          我們再來理解上面的程序。

          String a = "chenssy";

          String b = "chenssy";

          a、b和字面上的chenssy都是指向JVM字符串常量池中的”chenssy”對象,他們指向同一個對象。

          String c = new String("chenssy");

          new關(guān)鍵字一定會產(chǎn)生一個對象chenssy(注意這個chenssy和上面的chenssy不同),同時這個對象是存儲在堆中。所以上面應(yīng)該產(chǎn)生了兩 個對象:保存在棧中的c和保存堆中chenssy。但是在Java中根本就不存在兩個完全一模一樣的字符串對象。故堆中的chenssy應(yīng)該是引用字符串 常量池中chenssy。所以c、chenssy、池chenssy的關(guān)系應(yīng)該是:c--->chenssy--->池chenssy。整個 關(guān)系如下:

          201404271001

          通過上面的圖我們可以非常清晰的認(rèn)識他們之間的關(guān)系。所以我們修改內(nèi)存中的值,他變化的是所有。

          總結(jié):雖然a、 b、c、chenssy是不同的對象,但是從String的內(nèi)部結(jié)構(gòu)我們是可以理解上面的。String c = new String("chenssy");雖然c的內(nèi)容是創(chuàng)建在堆中,但是他的內(nèi)部value還是指向JVM常量池的chenssy的value,它構(gòu)造 chenssy時所用的參數(shù)依然是chenssy字符串常量。

          為了讓各位充分理解常量池,特意準(zhǔn)備了如下一個簡單的題目:

    String a = "chen"; String b = a + new String("ssy");
             創(chuàng)建了幾個String對象??
    主站蜘蛛池模板: 自拍偷自拍亚洲精品情侣| 国产精品美女自在线观看免费| 亚洲av无码专区国产不乱码| 日韩a毛片免费观看| 国产一区二区三区在线免费| 亚洲国产综合精品中文第一区| 中文字幕在线免费看线人| 亚洲熟妇无码乱子AV电影| 国色精品va在线观看免费视频| 亚洲无线观看国产精品| 18禁在线无遮挡免费观看网站| 亚洲va久久久噜噜噜久久天堂| 亚洲精品无码成人| 日韩免费无码视频一区二区三区 | 无码国模国产在线观看免费| 亚洲 欧洲 日韩 综合在线| 日韩黄色免费观看| 污网站在线免费观看| 亚洲中文字幕第一页在线| 免费在线看黄的网站| 亚洲色av性色在线观无码| 在线观看人成网站深夜免费| 免费无码国产在线观国内自拍中文字幕| 亚洲国产精品一区二区第一页免| 国产免费久久精品99久久| 国产成人免费A在线视频| 免费无遮挡无遮羞在线看 | 亚洲精品无码专区久久同性男| 亚洲一级大黄大色毛片| 国产在线观看免费完整版中文版| 国产成人亚洲毛片| 亚洲不卡av不卡一区二区| xxxx日本在线播放免费不卡| 最新免费jlzzjlzz在线播放| 黄色免费网址在线观看| 亚洲AV永久无码精品成人| 成人免费无码大片a毛片软件| 九九视频高清视频免费观看| 亚洲高清无在码在线无弹窗 | 久久国产亚洲高清观看| 四虎影视成人永久免费观看视频|