java中String长度有没有限制

编译期

有如下代码:

String s = "11111...1111";//其中有10万个字符"1"

使用javac编译为class文件,报错如下

错误: 常量字符串过长

javac的代码中可以看到下面的方法

private void checkStringConstant(DiagnosticPosition var1, Object var2) {
    if (this.nerrs == 0 && var2 != null && var2 instanceof String && ((String)var2).length() >= 65535) {
        this.log.error(var1, "limit.string", new Object[0]);
        ++this.nerrs;
    }
}

代码中可以看出,当参数类型为String,并且长度大于等于65535的时候,就会导致编译失败。

这个地方大家可以尝试着debug一下javac的编译过程,也可以发现这个地方会报错。

如果我们尝试以65534个字符定义字符串,则会发现可以正常编译。

运行期

String类中有很多重载的构造函数,其中有几个是支持用户传入length来执行长度的:

public String(byte bytes[], int offset, int length) 

可以看到,这里面的参数length是使用int类型定义的,那么也就是说,String定义的时候,最大支持的长度就是int的最大范围值。
int 是一个 32 位变量类型,取正数部分来算的话,他们最长可以有

2^31-1 =2147483647 个 16-bit Unicodecharacter

2147483647 * 16 = 34359738352 位
34359738352 / 8 = 4294967294 (Byte)
4294967294 / 1024 = 4194303.998046875 (KB)
4194303.998046875 / 1024 = 4095.9999980926513671875 (MB)
4095.9999980926513671875 / 1024 = 3.99999999813735485076904296875 (GB)

这接近于 4GB 大小,想要申请这么一大块连续的内存空间,失败也就不足为奇了,所以和电脑的硬件条件有关

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值