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 字符的字符串可以节省一倍的内存空间。

相关文章
string(字符串)
在 Lua 中,字符串可以用双引号或单引号定义,如 `string1 = "this is string1"` 和 `string2 = 'this is string2'`。多行字符串可由两个方括号包围,例如 `html` 变量所示,它包含了一个 HTML 片段。Lua 会尝试将数字字符串转换为数值进行算术运算,但混合字符串和数字可能导致错误,如 `"error" + 1`。
|
6天前
|
Linux
vs2019测试sizeof(string)的长度是28
vs2019测试sizeof(string)的长度是28
40 0
|
10月前
|
C# 索引
C#基础⑨——字符串(string str = null 与string str = ““的区别)
字符串数组变字符串(字符串数组变新的字符串数组)
C++构建string迭代器输出string中字符的个数
C++构建string迭代器输出string中字符的个数
|
存储
String(字符串)
String(字符串)
61 0
|
Java
String字符串
在Java里面使用的是String作为字符串的定义。
66 0
String字符串
|
存储
写出 String s = “hello“; 和 String s2 = new String(“world“);创建字符 串的区别
** 写出 String s = “hello”; 和 String s2 = new String(“world”);创建字符 串的区别。 **
154 0
写出 String s = “hello“; 和 String s2 = new String(“world“);创建字符 串的区别
|
Java 开发者
String字符串| 学习笔记
快速学习String字符串
String字符串| 学习笔记
|
存储 C++ Windows
C/C++字符串string操作的全面总结(一)
C/C++字符串string操作的全面总结
210 0
C/C++字符串string操作的全面总结(二)
C/C++字符串string操作的全面总结
135 0