原創地址: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語言的指針類型有關,如今筆者還有些東西沒有想清楚,想清楚後會改,敬請期待~