java中string究竟佔多少字節

       原創地址:http://my.oschina.net/u/2323537/blog/530423java

        之前學java基礎的時候考慮過string佔多少字節,百度後有人說一個漢字佔兩個字節,因此一個string的字節數是可變的,遇到一個漢字+2,遇到一個字母+1。筆者對此結論嚴重懷疑,一個string在分配內存空間的過程當中怎麼可能會動態變化呢。筆者開始嘗試測試string所佔的字節數。數組

一:首先想到的是經過string的getBytes方法測試其所佔長度,是否與上述結論一致。jvm

    請看下面代碼:測試

String  a="中國";
System.out.println(a.getBytes().length);

返回結果爲6。.net

這個結果與上述結論明顯有出入,一個漢字佔3個字節嗎?顯然不是這樣的,由於一個char佔兩個字節,char是能夠存放一個漢字的。getBytes方法只是將字符串轉換爲字節碼,其轉換關係在源碼中能夠找到,他是使用默認字符集將string轉換爲byte序列的,至於爲啥每一個漢字在getBytes的時候是3個,還請大神指教。指針

二:經過outofmemory異常測試
調試

首先咱們的電腦內存空間是有限的,因此若是定義一個數組的長度過長,必定會拋出outofmemory異常,每一個人的整塊內存空間應該是不同的,因此筆者先測了下本身電腦上的最大整塊內存空間,經屢次調試,發現內存空間大小爲1365966832字節。code

byte b[]=new byte[1365966832];

這是一個臨界值,再加1就會拋出outofmemory異常。大概1.3個G。對象

同理測試,用string數組建立的話,臨界值爲341491708。blog

上面的數除如下面的數等於4!故爲4個字節。

三:因爲建立對象的初期,jvm虛擬機會把分配到的內存空間所有初始化爲0(不包括對象頭),其值爲這些字段的數據類型對應的0值(引自深刻理解java虛擬機),因此目前數組中的每一個string仍是null值(string對應的0值爲null),那麼根據最開始的可變理論,咱們上述的結論還不夠有說服力。咱們開始爲該數組賦值。

String str[]=new String[341491708];
for(int i=0;i<str.length;i++){
    str[i]="f";    
}
System.out.println(str[0]);

結果沒有拋出異常,數組長度再大也能夠。說明字節長度不變就是4個字節。

四.有人可能會說,這樣聲明的字符串是被放到常量池裏了,返回的只是個引用。ok咱們利用最後零散的的內存空間new字符串出來。

--------

擦擦擦,剛剛死機了,感謝oschina的自動保存功能。。。

--------

String str[]=new String[341491708];
for(int i=0;i<str.length;i++){
    str[i]=new String("f"); 
    if(i>996710){
        System.out.println(i);
    }   
}

結果個人電腦不到100萬就溢出了,換再長的字符串也同樣。這裏想親手作實驗的童鞋注意,之因此有個if判斷纔打印是由於打印很耗時,過濾掉前面沒用的打印而已。

綜上所述string佔4字節

----------------------------------------------------割割割割割割----------------------------------------

以上論斷是錯的,具體緣由應該與c語言的指針類型有關,如今筆者還有些東西沒有想清楚,想清楚後會改,敬請期待~

相關文章
相關標籤/搜索