问:字符串有长度限制吗?是多少?
答:首先字符串的内容是由一个字符数组 char[ ] 来存储的,由于数组的长度及索引是整数,且String类中返回字符串长度的方法length() 的返回值也是int ,所以通过查看java源码中的类Integer我们可以看到Integer的最大范围是2^31 -1,由于数组是从0开始的,所以数组的最大长度可以使【0~2^31】通过计算是大概4GB。
但是通过翻阅java虚拟机手册对class文件格式的定义以及常量池中对String类型的结构体定义我们可以知道对于索引定义了u2,就是无符号占2个字节,2个字节可以表示的最大范围是2^16 -1 = 65535。
其实是65535,但是由于JVM需要1个字节表示结束指令,所以这个范围就为65534了。超出这个范围在编译时期是会报错的,但是运行时拼接或者赋值的话范围是在整形的最大范围。
/*
2^16 = 32768 : unsigned short
2^32 = 4.29497e+009 : unsigned int, long
2^64 = 1.84467e+019 : unsigned long long
SHRT_MAX = 32767 (3.2e+004): short
INT_MAX = 2147483647 (2.1e+009) : int
LONG_MAX = 2147483647 (2.1e+009) : long
LONG_LONG_MAX = 9.2e+018 : long long
*/