android string参数最大长度,每日一问 | 我们经常用的 String类型,你知道它最大可以放多长的字符串吗?...
String被用作常量時,它被編譯器當成字面量存放于常量池。常量池中主要存放兩大類常量:字面量和符號引用;常量池中的每一個常量都是一個表,字符串常量存于CONSTANT_Utf8_info表(Tip:字節碼文件由無符號數和表映射的數據構成,詳見java虛擬機規范或者周志明老師的深入理解Java虛擬機)。
CONSTANT_Utf8_info {
u1 tag;
u2 length;
u1 bytes[length];
}
CONSTANT_Utf8_info表由tag、length和bytes組成。tag用于標識表的類型,大小為一個字節的無符號數;length表示使用utf-8縮略編碼表示的字符串長度,大小為兩個字節的無符號數;bytes存放被編碼的字符串。字符串常量的最大值為2^16-1(65535)字節。當使用javac編譯Test.java文件時,由于其中的字符串長度為65535,超出javac中規定的大小,編譯失敗;下面是含長度為65534的字符串的Test類編譯前后的內容,位于0x7E~0x1007E(包括起止的兩個字節)之間的數據為一個CONSTANT_Utf8_info表的映射,tag值為0x01(位于0x7E),之后的兩個字節表示length值為0xFFFE(65534),隨后的65534個字節字符串內容。
public class Test{
//65534個a
String str="aaaa...";
}
//字節碼內容
Offset: 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
00000000: CA FE BA BE 00 00 00 34 00 13 0A 00 05 00 0E 08 J~:>...4........
00000010: 00 0F 09 00 04 00 10 07 00 11 07 00 12 01 00 03 ................
00000020: 73 74 72 01 00 12 4C 6A 61 76 61 2F 6C 61 6E 67 str...Ljava/lang
00000030: 2F 53 74 72 69 6E 67 3B 01 00 06 3C 69 6E 69 74 /String;...
00000040: 3E 01 00 03 28 29 56 01 00 04 43 6F 64 65 01 00 >...()V...Code..
00000050: 0F 4C 69 6E 65 4E 75 6D 62 65 72 54 61 62 6C 65 .LineNumberTable
00000060: 01 00 0A 53 6F 75 72 63 65 46 69 6C 65 01 00 09 ...SourceFile...
00000070: 54 65 73 74 2E 6A 61 76 61 0C 00 08 00 09 01 FF Test.java.......
00000080: FE 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 ~aaaaaaaaaaaaaaa
...
00010070: 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 0C aaaaaaaaaaaaaaa.
00010080: 00 06 00 07 01 00 04 54 65 73 74 01 00 10 6A 61 .......Test...ja
00010090: 76 61 2F 6C 61 6E 67 2F 4F 62 6A 65 63 74 00 21 va/lang/Object.!
000100a0: 00 04 00 05 00 00 00 01 00 00 00 06 00 07 00 00 ................
000100b0: 00 01 00 01 00 08 00 09 00 01 00 0A 00 00 00 27 ...............'
000100c0: 00 02 00 01 00 00 00 0B 2A B7 00 01 2A 12 02 B5 ........*7..*..5
000100d0: 00 03 B1 00 00 00 01 00 0B 00 00 00 0A 00 02 00 ..1.............
000100e0: 00 00 01 00 04 00 02 00 01 00 0C 00 00 00 02 00 ................
000100f0: 0D
javac無法編譯字符串常量長度超過65534的java文件
原因:javac中對字符串常量長度做了限制,可以下面的checkStringConstant方法中看出。(Tip:javac源碼位于OpenJDK中,并且各個版本路徑不一定相同,修改上面的字節碼文件,將length值由0xFFFE改為0xFFFF,并將bytes數據添加一個字節,執行java命令,程序正常運行。)
//位于javac源碼中的Gen.java文件,Errors.LimitString 為constant string too long
//Pool.MAX_STRING_LENGTH值為0xFFFF
/** Check a constant value and report if it is a string that is
* too large.
*/
private void checkStringConstant(DiagnosticPosition pos, Object constValue) {
if (nerrs != 0 || // only complain about a long string once
constValue == null ||
!(constValue instanceof String) ||
((String)constValue).length() < Pool.MAX_STRING_LENGTH)
return;
log.error(pos, "limit.string");
nerrs++;
}
String被當作變量時,其長度由String存儲方式決定。在JAVA SE 9之前,String內部是由char數組存儲的,數組最大長度為Integer.MAX_VALUE(0x7fffffff),即2^31-1,并且char的取值范圍在0~65535之間,占兩個字節,因此String的最大長度為429496967294字節,運行時需要大約4GB的內存才能存儲;JAVA SE 9及其后續版本將char數組改為byte數組,因此String的最大長度為2147483647字節。
總結
以上是生活随笔為你收集整理的android string参数最大长度,每日一问 | 我们经常用的 String类型,你知道它最大可以放多长的字符串吗?...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 香蜜台词共赴鸿蒙,香蜜台词斗法
- 下一篇: java制作加载界面_Java如何制作启