Java中的字符串(String)最大长度限制

createh51个月前 (02-01)技术教程13


看String的源码可以看出来,String实际存储数据的是char value[],数组的长度是int类型,

整数在java中是有限制的,我们通过源码来看看int类型对应的包装类Integer可以看到,其长度最大限制为2^31 -1,那么说明了数组的长度是0~2^31-1,那么计算一下就是(2^31-1 = 2147483647 = 4GB)。但我们开发的时候,也会出现因为字符串过长导致的编译错误:常量字符串过长。这是为什么呢?

对于字符串可以承受的最大长度,要分为2个阶段,一个是编译时期(也就是你代码定义了一个String字符串,String s= "xiaohu"),一个是运行时期(指在程序运行过程中)。


当String为常量时

这时候,JDK编译期String字符串限制的,我们都知道JVM里面是包含常量池的,(是一种对字符串的性能优化,不用反复创建新的字符串了)当我们使用字符串字面量直接定义String的时候,是会把字符串在常量池中存储一份的。常量池中的每一项常量都是一个表,都有自己对应的类型。Java中的UTF-8编码的Unicode字符串在常量池中以CONSTANT_Utf8_info类型表,结构如下:

u2类型的length的值就表明了这个UTF-8编码字符串长度是多少字节。

所以CONSTANT_Utf8_info型常量对应的最大长度也就是java中UTF-8编码的字符串的长度,顺便提一下Class文件中的方法和字段也是引用CONSTANT_Utf8_info型常量来描述名称的。u2是无符号的16位整数,因此理论上允许的的最大长度是2^16-1=65535。

总结一下:在Javac编译器下,字符串String的最大长度限制也即是U2类型所能表达的最大长度65534。避开javac最大长度是65535?

当String为变量时

String内部是以char数组的形式存储,数组的长度是int类型,那么String允许的最大长度就是Integer.MAX_VALUE了。又由于java中的字符是以16位存储的,因此大概需要4GB的内存才能存储最大长度的字符串。

总结

首先字符串的内容是由一个字符数组 char[] 来存储的,由于数组的长度及索引是整数,且String类中返回字符串长度的方法length() 的返回值也是int ,所以通过查看java源码中的类Integer我们可以看到Integer的最大范围是2^31 -1,由于数组是从0开始的,所以数组的最大长度可以使【0~2^31】通过计算是大概4GB。

但是通过翻阅java虚拟机手册对class文件格式的定义以及常量池中对String类型的结构体定义我们可以知道对于索引定义了u2,就是无符号占2个字节,2个字节可以表示的最大范围是2^16 -1 = 65535。

其实是65535,但是由于JVM需要1个字节表示结束指令,所以这个范围就为65534了。超出这个范围在编译时期是会报错的,但是运行时拼接或者赋值的话范围是在整形的最大范围。

Eclise编译超过65534长度的字符串不报错,是Eclipse有自己的Java编译器。JDT优化为了StringBuilder的append。

Eclise使用自己的编译器。主要原因是JDT核心具有渐进式编译的能力,这意味着它会逐步编译代码中的更改(这也是Eclipse不需要编译按钮的原因,因为它会在检测到更改时自动编译)。但Oracle的JDK不支持增量编译。

相关文章

AutoHotKey(简称ahk)中的对象和数组

AutoHotKey(简称ahk)中的对象和数组本篇说明的是AHK中的对象数组,在编写一些稍微复杂的代码时,必不可少需要一种能够组织数据的容器,如果每个数据都不得不创建一个变量,用起来会很麻烦,而且看...

阿里开源MNNKit:基于MNN的移动端深度学习SDK,支持安卓和iOS

机器之心报道参与:一鸣、Jamin近来,有越来越多的深度学习框架开始面向移动端进行发展。近日,阿里也基于其 MNN 推理引擎开源了最新的 MNNKit 深度学习 SDK,安卓和 iOS 开发者都可以方...

C 语言简单编程速成(c语言编程快速入门)

我们将所有的 C 语言要素放置到一份易读的备忘录上。? 来源:linux.cn ? 作者:Seth Kenlon ? 译者:郑 ?(本文字数:5500,阅读时长大约:8 分钟)我们将所有的 C 语言要...

Oracle探究_JAVA存储过程_开发指引《中》

HLS HLS/MD1201.5 返回PLSQL集合变量有一种业务场景是在主逻辑处理完后需要返回多个数据。结合JAVA不能类似PLSQL存储过程有OUT参数,只能开发返回函数形式的Method,以下将...

Java没有指针,只有引用,如何关联变量,实现各类数据结构?

C语言离不开指针,指针作为一种派生类型,是数据关联的一种主要手段(实现顺序存储和链式存储)。数组下标运算也只是指针算术运算的语法糖。其中数组名是一个常量(为安全考量),数组下标运算替换为指针运算,由C...