轉自:
http://www.java265.com/JavaJingYan/202206/16565092013833.html
下文筆者講述java中String字串最大可存盤長度的簡介說明
寫在前面的話:
String型別的長度是有限制的
并不是可存盤無限長度的字串
下文筆者將依次講述String型別存盤長度簡介說明,如下所示
java編譯期的長度限制
例:
String str = "我愛java265";
System.out.println(str);
//以上定義的str字串,會存盤在常量池中,
//常量池中的UTF-8編碼的Unicode字串在常量池中
將使用CONSTANT_Utf8型別進行
CONSTANT_Utf8 型別結構:
CONSTANT_Utf8_info {
u1 tag;
u2 length;
u1 bytes[length];
}
陣列中存盤的即是字串實際存盤位置
length可存盤的最大位元組數,u2:是一個無符號的16位整數
所以理論上最大可存盤2^16-1=65535的位元組
注意事項:
//65535個a,編譯報錯
String s = "aa..aa";
//65534個a,編譯通過
String s1 = "aa..a";
為什么會出現這種情況呢?這是由于javac編譯器的限制,如:javac編譯器的原始碼
private void checkStringConstant(DiagnosticPosition var1, Object var2) {
if (this.nerrs == 0 && var2 != null && var2 instanceof String && ((String)var2).length() >= 65535) {
this.log.error(var1, "limit.string", new Object[0]);
++this.nerrs;
}
}
String運行時-實際可存盤大小說明
String 運行時的限制,我們可以從String建構式上
public String(char value[], int offset, int count) {
...
}
count:字串的最大長度
由于int型別最大長度是2^31-1
所以在運行時,String 的最大長度是2^31-1,
但只是理論上的長度,實際長度還需查看JVM記憶體
(2^31-1)*2*16/8/1024/1024/1024 = 4GB
一個最大的字串要占用4GB的記憶體,當虛擬機不能分配大于4GB的記憶體時,會直接報錯
String 的長度存在限制 編譯期: 字串的UTF8編碼值的位元組數不能超過65535,字串的長度不能超過65534 運行時: 字串的長度不能超過2^31-1 占用的記憶體數不能超過虛擬機能夠提供的最大值
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/498507.html
標籤:其他
上一篇:跨平臺(32bit和64bit)的 printf 格式符 %lld 輸出64位的解決方式
下一篇:Python“預警機”
