String长度有限制吗?是多少?
Java中String是有长度限制的,在JVM编译中还有规范。
String其实是使用的一个char类型的数组来存储字符串中的字符的。
public final class String
implements java.io.Serializable, Comparable<String>, CharSequence,
Constable, ConstantDesc {
@Stable
private final byte[] value;
public int length() {
return value.length >> coder();
}
从 length() 函数看,返回的是 int 类型,是否表示长度就是 int 的最大值 2^31,大概是 4G ?
The answer is no!!!
JVM 规范另有规定。字面量形式定义的 String,存放在常量池,JVM 对常量词中的 String 有限制,多长,依赖于虚拟机的定义。
CONSTANT_String_info {
u1 tag;
u2 string_index;
}
这里定义的 u2 string_index 表示的是常量池的有效索引。
在class文件中u2表示的是无符号数占2个字节单位,我们知道1个字节占8位,2个字节就是16位 ,那么2个字节能表示的范围就是2^16- 1 = 65535。
总结
首先,字符串的内容是由一个字符数组 char[] 来存储的,由于数组的长度及索引是整数,且String类中返回字符串长度的方法length() 的返回值也是int,理论上长度可以是 2^31,接近 4G。
但是,虚拟机手册对class文件格式的定义以及常量池中对String类型的结构体定义我们可以知道对于索引定义了u2,就是无符号占2个字节,2个字节可以表示的最大范围是2^16 -1 = 65535,由于JVM需要1个字节表示结束指令,所以这个范围就为65534了。
结论,String 的长度限制 在 65534。
本文由博客群发一文多发等运营工具平台 OpenWrite 发布
网友评论