java string最大长度_Java中的字符串最大长度

本文探讨了Java中字符串的最大长度,指出源文件中字符串长度受制于65534,这是由于Class文件常量池的结构限制。而在程序运行时动态生成的字符串理论上可以更长,可能达到2^32或2^64。通过编译和修改class文件的实验验证了这一理论,并解释了源文件比Class文件中字符串长度少一个的可能原因。
摘要由CSDN通过智能技术生成

Java中字符串的最大长度肯定不会是无穷大,这个毫无疑问,受限于物理机器内存,分配的Java虚拟机内存。归根结底跟该字符串存储的位置,表达方式有关。如果该字符串是在Java源文件中定义的,其长度超过了65534,那么编译会报错,如果是通过程序动态生成的,那么其大小肯定是可以超过65534的。产生这种差别的原因是,编译源文件后生成的是class文件,字符串存储在Class文件的常量池中,类型为Constant_utf8_info,数据结构为一个1字节代表数据类型,一个2字节的无符号数表示后续的字节长度,再跟着的就是该U2长度的字节数组。很容易推出这个字节数组的长度不能超过2^16=65536。

下面是验证的过程:

1,编写如下Java文件:

public class Hello {

public static void main(String[] args){

// 65534个字符a

String maxLength="aaaaaaaaaa...";

System.out.println(maxLength.length());

}

}

一直添加a的个数,当为65534时是可以正常编译的,为65535时则会报出这个错误:

763eaaa24f67682a8e79bf989b764fe0.png

保持65534个a编译,执行程序,输出如下:

54fbe0468d9ca19f4c04c82904de8312.png

2,用hex打开class文件,查看16进制格式,标出的位置表示的是65534个a在常量池中的位置:

230682f00a94cc2580c4359c255b8c17.png

3,修改FE为FF,然后再插入一个16进制为61的字节,即字符a,红色代表发生了修改,如下:

fae22332ceb9a9e6636a6e79fd28b103.png

4,保存后在重新执行程序,输出值为65535,如下:

b0636d0539c066f3c0bc6d77bff09f25.png

以上过程说明,实际上在Class文件中,确实是可以支持最大65535个字符,即2字节无符号数的最大值,但是源文件中却会比最大值少一个,我猜测也许是从源文件编译成字节码的过程中,可能有类似于;的结束符占用了一个字符的位置。(应该可以从javac的源码中找到答案,等找到后再补充)。

备注:

上面说的是从源文件生成的问题,如果是程序运行时动态生成的话,理论值应该是2^32或者2^64(未验证)。因为这个时候的字符串应该是(不是绝对的)存在Java堆中,在本地方法只存储该对象的引用,即reference类型,该类型可能是4个字节,也可能是8个字节。所以理论值是2^32或者2^64

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值