<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 :: 首頁 ::  :: 聯系 :: 聚合  :: 管理

    String對象是不可變的

    Scanner掃描字符串對象。

    備注:

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

    對于Constant Pool,表的基本通用結構為:
    cp_info {
            u1 tag;
            u1 info[];
    }

    tag是一個數字,用來表示存儲的常量的類型,例如8表示String類型,5表示Long類型,info[]根據
    類型碼tag的不同會發生相應變化.
    對于String類型,表的結構為:
    CONSTANT_String_info {
            u1 tag;
            u2 string_index;
    }
    tag固定為8,string_index是字符串內容信息,類型為:
    CONSTANT_Utf8_info {
            u1 tag;
            u2 length;
            u1 bytes[length];
    }
    tag固定為1,length為字符串的長度,bytes[length]為字符串的內容.

    代碼樣例
    (以下代碼在jdk6中編譯)
    為了詳細理解Constant Pool的結構,我們參看一些代碼:
        String s1
    = "sss111";
        String s2
    = "sss222";
        System.out.println(s1
    + " " + s2);
    由于
    "sss111""sss222"都是字符串常量,在編譯期就已經創建好了存儲在class文件中.
    在編譯后的class文件中會存在這2個常量的對應表示:
    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

    根據上面說的String常量結構,我們分析一下
    開始的08為CONSTANT_String_info結構中的tag,而11應該是它的相對引用,01為
    CONSTANT_Utf8_info的tag,06為對應字符串的長度,
    73 73 73 31 31 31為字符串對
    應的編碼,接著分析,會發現后面的是對應
    "sss222"的存儲結構.

    經過上面分析,我們知道了11和13是兩個字符串的相對引用,就可以修改class文件
    來修改打印的內容,把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中
    只會創建一個,所以在編譯好的class文件中,我們只能找到一個對
    "sss111"的表示:
    000000abh:
    08 00 11 01 00 06 73 73 73 31 31 31             ; ......sss111

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

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

    關于String類的說明

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

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

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

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

    String的創建方法

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

    面試題:

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


    主站蜘蛛池模板: 青苹果乐园免费高清在线| 亚洲精品成人a在线观看| 欧美亚洲精品一区二区| 国产国拍亚洲精品福利 | 久久亚洲熟女cc98cm| 天天摸天天操免费播放小视频| 一个人免费观看视频在线中文| 亚洲精品自拍视频| 免费A级毛片无码久久版| 高清一区二区三区免费视频| 亚洲码和欧洲码一码二码三码| 亚洲熟妇无码另类久久久| 欧亚精品一区三区免费| 99热在线日韩精品免费| 亚洲熟妇无码av另类vr影视| 亚洲人精品午夜射精日韩 | 国产男女性潮高清免费网站| 热久久这里是精品6免费观看| 亚洲日韩AV无码一区二区三区人| 国产日韩亚洲大尺度高清| 在线播放高清国语自产拍免费| 182tv免费视频在线观看| 日日摸日日碰夜夜爽亚洲| 亚洲福利一区二区三区| 国产亚洲成人在线播放va| 国产片AV片永久免费观看| 中国一级特黄高清免费的大片中国一级黄色片 | fc2免费人成在线| 亚洲成aⅴ人在线观看| 亚洲综合精品香蕉久久网| 日日AV拍夜夜添久久免费| 香港a毛片免费观看| 一级做a爰片久久免费| 亚洲AV日韩综合一区| 亚洲欧洲日产v特级毛片| 国产成人亚洲综合无码精品 | 久久久久久久91精品免费观看| a毛片在线免费观看| 成在线人直播免费视频| 亚洲精品乱码久久久久蜜桃| 亚洲国产精品日韩在线|