String是由长度限制的吗

String长度是有限制的吗

情况还原: 在将图片转为base64的字符串的时候,编译器提示 String常量字符串过长。

String是怎么存储的

String实际上是用一个char类型的数组来存储字符串中的字符的。
既然是这样,那这个char类型的数组会有长度的限制吗,是的,是有限制的。


来看一下 String length方法的源码
public int length(){
	return value.length;
}

因此,如果数组当中有元素,那么它的长度就是元素的数量,如果没有元素,那么它的长度就是 0 ~ 2^31 -1,也就是大概4GB,21亿个字符串。

那我们的这个base64的字符串超过了4GB了吗,当然没有。在JVM编译规范里有规定,如果我们定义了字符串字面量,编译时会将它放到常量池当中,此时jvm对这个常量池存储String类型做出了限制。

这里补充一个知识:
所有常量池项都具有如下的通用格式:

cp_info{
	u1 tag;
	u1 info[];
}

如果这是一个String,那它的结构就是

CONSTANT_String_info{
	u1 tag;
	u2 String_index;
}

常量String在这里的String_index必须是Constant_Utf8_info

CONSTANT_Utf8_info{
	u1 tag;
	u2 length;
	u1 bytes[length];
}

在class文件中u2表示的是无符号数占两个字节,两个字节就是16位,因此length的最大长度 即 作为常量的字符串能表达的长度就是 0 ~ 2^16 -1。

还有还有,因为jvm需要一个结束指令占用一个字节,所以真实的长度是65534。也就是,一个字符串最多能放65534个字节。

一个汉字两个字节,一个英文字母一个字节,所以你看看咯,一串字符串常量最多能放多少个汉字多少个字母。

另外,如果你想突破这个限制,就不要定义常量啦,用传入的方式传进去就好了。例如通过文件得到这串字符串,例如一个图片只给url,分析称base64Str的工作交给程序来,不要用常量的形式来就好了。

你可能感兴趣的:(私人干货,java)