String长度限制

String长度有限制吗?是多少?

Java中String是有长度限制的,在JVM编译中还有规范。
String其实是使用的一个char类型的数组来存储字符串中的字符的。

public final class String
    implements java.io.Serializable, Comparable, 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 发布

你可能感兴趣的:(String长度限制)