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

简介: String 类型的对象,他们是有长度限制的,String 对象并不能“存储”无限长度的字符串。关于 String 的长度限制要从编译时限制和运行时限制两方面考虑。

String 类型的对象,他们是有长度限制的,String 对象并不能“存储”无限长度的字符串。关于 String 的长度限制要从编译时限制运行时限制两方面考虑。

一、编译时限制:65534

我们知道字符串常量会被放入方法区的常量池中,JVM 规范对常量池有所限制。常量池中的每一种数据项都有自己的类型。Java 中的 UTF-8 编码的 Unicode 字符串在常量池中以 CONSTANT_Utf8 类型表示。

CONSTANT_Utf8的数据结构如下:

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

我们重点关注下长度为 length 的那个 bytes 数组,这个数组就是真正存储常量数据的地方,而 length 就是数组可以存储的最大字节数。length 的类型是 u2,u2 是无符号的 16 位整数,因此理论上允许的的最大长度是 2^16-1=65535。但是由于 JVM 需要 1 个字节表示结束指令,所以编译时 String 最大长度不能超过 65534

二、运行时限制:2^31 -1

字符串的内容是由一个字符数组 char[] 来存储的,而数组的长度及索引都是 int 类型。在 Java 中,int 的最大长度是2^31 -1

但是这个也是理论上的长度,实际的长度还要看你 JVM 的内存。最大的字符串会占用多大的内存为 4GB。计算方式如下:

(2^31-1)*2*16/8/1024/1024/1024 = 4GB

所以在最坏的情况下,一个最大的字符串要占用 4GB 的内存。如果你的虚拟机不能分配这么多内存的话,会直接报错的。

JDK9 以后对 String 的存储进行了优化。底层不再使用 char 数组存储字符串,而是使用 byte 数组。对于 LATIN1 字符的字符串可以节省一倍的内存空间。

相关文章
|
17天前
|
索引 Python
String(字符串)
String(字符串)。
25 3
|
4月前
|
存储 Java 编译器
String能存储多少个字符
String能存储多少个字符
|
7月前
|
存储 Java 编译器
String能存储多少个字符?
这篇内容讨论了Java中String的长度限制。编译时,如果字符串长度大于等于65535,编译器将报错。这是由于`CONSTANT_Utf8`常量池项的长度字段是16位无符号整数,最大值为65535。而在运行时,虽然理论上String的最大长度是2^31-1,但实际长度受限于JVM内存,最大可能占用约2GB内存,超过可能导致OutOfMemoryError。JDK9以后,对于LATIN1字符的字符串,存储优化使用byte数组,节省内存。
370 1
String能存储多少个字符?
new String()定义字符串为空,char[] chs = {‘a‘,‘b‘,‘c‘} String s2 = new String(chs) 输出abc,byte定99为a
new String()定义字符串为空,char[] chs = {‘a‘,‘b‘,‘c‘} String s2 = new String(chs) 输出abc,byte定99为a
|
6月前
|
Java
最大的 String 字符长度是多少?
最大的 String 字符长度是多少?
byte[]转换成String
byte[]转换成String
|
Java
String字符串
在Java里面使用的是String作为字符串的定义。
93 0
String字符串
C++构建string迭代器输出string中字符的个数
C++构建string迭代器输出string中字符的个数
|
存储
写出 String s = “hello“; 和 String s2 = new String(“world“);创建字符 串的区别
** 写出 String s = “hello”; 和 String s2 = new String(“world”);创建字符 串的区别。 **
193 0
写出 String s = “hello“; 和 String s2 = new String(“world“);创建字符 串的区别
|
存储 C++ Windows
C/C++字符串string操作的全面总结(一)
C/C++字符串string操作的全面总结
265 0