你知道String一次可以new多少个char吗?

Copyright©stonee
早知道前1年半就好好学习了QAQ

我们知道String有一个构造方法是这样的:

   public String(char value[], int offset, int count) {
        this(value, offset, count, rangeCheck(value, offset, count));
    }

它的意思就是说一共接收count个字符,那么因为count是int,所以 我们可以初步认为char vlaue[]中可以保存Integer.MAX_VALUE个字符,即0x7fffffff个char型,换成位的话需要*16。

但是我刚才做了个实验

public class TestString {
    public static void main(String[] args) {
//        String str = "";
//        for (int i = 0; i <65355; i++) {
//            str = str + "i";
//        }
        String a ="ii...ii";	//65535个i
        String a ="ii...ii";	//65534个i  /ok
        System.out.println(a);
    }
}

如果是直接初始化65535个字符的时候,就会爆出异常:

错误:(12, 19) java: 常量字符串过长

QAQ 不是说好了0x7ffffffff个吗,为什么才65535个就报错了,原因就出在常量池

在字符串常量池中,Java中UTF-8的Unicode字符串都是以CONSTANT_Utf8类型表示,而其中的length要求为无符号的16位整数

所以在运行时期:

2^16 = 65536,但是java class文件中是一种变体UTF-8格式,null值需要两个字节,因此只剩下了我们栗子中的65534个字节了,换成位的话,还需要*16.

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值