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

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

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

    沙漠中的魚

    欲上天堂,先下地獄
    posts - 0, comments - 56, trackbacks - 0, articles - 119
      BlogJava :: 首頁 ::  :: 聯(lián)系 :: 聚合  :: 管理

    String對象是不可變的

    Scanner掃描字符串對象。

    備注:

    在java編譯好的class文件中,有個區(qū)域稱為Constant Pool,他是一個由數(shù)組組成的表,類型
    為cp_info constant_pool[],用來存儲程序中使用的各種常量,包括Class/String/Integer等各
    種基本Java數(shù)據(jù)類型,詳情參見The Java Virtual Machine Specification
    4.4章節(jié).

    對于Constant Pool,表的基本通用結(jié)構(gòu)為:
    cp_info {
            u1 tag;
            u1 info[];
    }

    tag是一個數(shù)字,用來表示存儲的常量的類型,例如8表示String類型,5表示Long類型,info[]根據(jù)
    類型碼tag的不同會發(fā)生相應(yīng)變化.
    對于String類型,表的結(jié)構(gòu)為:
    CONSTANT_String_info {
            u1 tag;
            u2 string_index;
    }
    tag固定為8,string_index是字符串內(nèi)容信息,類型為:
    CONSTANT_Utf8_info {
            u1 tag;
            u2 length;
            u1 bytes[length];
    }
    tag固定為1,length為字符串的長度,bytes[length]為字符串的內(nèi)容.

    代碼樣例
    (以下代碼在jdk6中編譯)
    為了詳細(xì)理解Constant Pool的結(jié)構(gòu),我們參看一些代碼:
        String s1
    = "sss111";
        String s2
    = "sss222";
        System.out.println(s1
    + " " + s2);
    由于
    "sss111""sss222"都是字符串常量,在編譯期就已經(jīng)創(chuàng)建好了存儲在class文件中.
    在編譯后的class文件中會存在這2個常量的對應(yīng)表示:
    08 00 11 01 00 06 73 73 73 31 31 31 08 00 13 01 ; ......sss111....
    00 06 73 73 73 32 32 32                         ; ..sss222

    根據(jù)上面說的String常量結(jié)構(gòu),我們分析一下
    開始的08為CONSTANT_String_info結(jié)構(gòu)中的tag,而11應(yīng)該是它的相對引用,01為
    CONSTANT_Utf8_info的tag,06為對應(yīng)字符串的長度,
    73 73 73 31 31 31為字符串對
    應(yīng)的編碼,接著分析,會發(fā)現(xiàn)后面的是對應(yīng)
    "sss222"的存儲結(jié)構(gòu).

    經(jīng)過上面分析,我們知道了11和13是兩個字符串的相對引用,就可以修改class文件
    來修改打印的內(nèi)容,把class文件中的
    00 6E 00 04 00 03 00 00 00 24 12 10 4C 12 12 4D
    改成
    00 6E 00 04 00 03 00 00 00 24 12 10 4C 12 10 4D
    程序就會輸出sss111 sss111,而不是和原程序一樣輸出sss111 sss222,因為我
    們把對
    "sss222"的相對引用12改成了對"sss111"的相對引用10.

    ------------分割線
    public class Test {
       
    public static void main(String[] args) {
            String s1
    = "sss111";
            String s2
    = "sss111";
        }
    }

    在上面程序中存在2個相同的常量
    "sss111",對于n個值相同的String常量,在Constant Pool中
    只會創(chuàng)建一個,所以在編譯好的class文件中,我們只能找到一個對
    "sss111"的表示:
    000000abh:
    08 00 11 01 00 06 73 73 73 31 31 31             ; ......sss111

    在程序執(zhí)行的時候,Constant Pool會儲存在Method Area,而不是heap中.

    另外,對于
    ""內(nèi)容為空的字符串常量,會創(chuàng)建一個長度為0,內(nèi)容為空的字符串放到Constant Pool中,
    而且Constant Pool在運行期是可以動態(tài)擴展的.

    關(guān)于String類的說明

    1.String使用private final char value[]來實現(xiàn)字符串的存儲,也就是說String對象創(chuàng)建之后,就不能
    再修改此對象中存儲的字符串內(nèi)容,就是因為如此,才說String類型是不可變的(immutable).

    2.String類有一個特殊的創(chuàng)建方法,就是使用""雙引號來創(chuàng)建.例如new String("i am")實際創(chuàng)建了2個
    String對象,一個是
    "i am"通過""雙引號創(chuàng)建的,另一個是通過new創(chuàng)建的.只不過他們創(chuàng)建的時期不同,
    一個是編譯期,一個是運行期
    !

    3.java對String類型重載了+操作符,可以直接使用+對兩個字符串進行連接.

    4.運行期調(diào)用String類的intern()方法可以向String Pool中動態(tài)添加對象.

    String的創(chuàng)建方法

    一般有如下幾種
    1.直接使用""引號創(chuàng)建.
    2.使用new String()創(chuàng)建.
    3.使用new String("someString")創(chuàng)建以及其他的一些重載構(gòu)造函數(shù)創(chuàng)建.
    4.使用重載的字符串連接操作符+創(chuàng)建.

    面試題:

    String s1 = new String("s1") ;
    String s2
    = new String("s1") ;
    上面創(chuàng)建了幾個String對象
    ?
    答案:3個 ,編譯期Constant Pool中創(chuàng)建1個,運行期heap中創(chuàng)建2個.


    主站蜘蛛池模板: 亚洲色大成网站www永久网站| 一级毛片免费全部播放| 亚洲?V无码成人精品区日韩| 国产精品免费网站| 亚洲国产精品无码久久| 国产亚洲一区区二区在线| 97视频免费在线| 人人公开免费超级碰碰碰视频 | 亚洲成色WWW久久网站| 我们的2018在线观看免费高清| 无人视频在线观看免费播放影院| 亚洲AV美女一区二区三区| 成人免费在线观看网站| 免费观看久久精彩视频| 亚洲AV一区二区三区四区| 亚洲天天做日日做天天看| 免费人妻av无码专区| 日韩在线免费视频| 大地资源中文在线观看免费版| 亚洲国产精品成人AV在线| 亚洲国产综合91精品麻豆| 高清在线亚洲精品国产二区| 最刺激黄a大片免费网站| 一级大黄美女免费播放| 国产亚洲sss在线播放| 久久香蕉国产线看观看亚洲片| 女人18毛片水最多免费观看| 久久99热精品免费观看牛牛| 免费夜色污私人影院网站| 亚洲精品免费网站| 亚洲av激情无码专区在线播放| 亚洲成人国产精品| 日韩精品无码区免费专区| 免费无码成人AV在线播放不卡| 一个人免费观看www视频| 久久久久久久久无码精品亚洲日韩| 777亚洲精品乱码久久久久久| 中文字幕精品无码亚洲字| 午夜两性色视频免费网站| 在线免费观看亚洲| 美女视频黄a视频全免费网站色窝 美女被cao网站免费看在线看 |